diff options
Diffstat (limited to 'MediaTek/FmRadio')
348 files changed, 27945 insertions, 0 deletions
diff --git a/MediaTek/FmRadio/Android.mk b/MediaTek/FmRadio/Android.mk new file mode 100755 index 0000000..2918f01 --- /dev/null +++ b/MediaTek/FmRadio/Android.mk @@ -0,0 +1,61 @@ +# Copyright Statement: +# +# This software/firmware and related documentation ("MediaTek Software") are +# protected under relevant copyright laws. The information contained herein +# is confidential and proprietary to MediaTek Inc. and/or its licensors. +# Without the prior written permission of MediaTek inc. and/or its licensors, +# any reproduction, modification, use or disclosure of MediaTek Software, +# and information contained herein, in whole or in part, shall be strictly prohibited. +# +# MediaTek Inc. (C) 2011-2014. All rights reserved. +# +# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON +# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH +# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES +# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES +# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK +# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR +# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND +# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO +# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +# +# The following software/firmware and/or related documentation ("MediaTek Software") +# have been modified by MediaTek Inc. All revisions are subject to any receiver's +# applicable license agreements with MediaTek Inc. + +ifeq ($(MTK_FM_SUPPORT),yes) +ifeq ($(MTK_FM_RX_SUPPORT),yes) + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_CERTIFICATE := platform + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := FmRadio +LOCAL_JNI_SHARED_LIBRARIES := libfmjni + +LOCAL_PROGUARD_ENABLED := disabled +LOCAL_PRIVILEGED_MODULE := true + +LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext +LOCAL_SRC_FILES += bsp/com/mediatek/fmradio/ExtensionUtils.java + +include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) + +endif +endif diff --git a/MediaTek/FmRadio/Android.mk~ b/MediaTek/FmRadio/Android.mk~ new file mode 100755 index 0000000..d7c93e8 --- /dev/null +++ b/MediaTek/FmRadio/Android.mk~ @@ -0,0 +1,68 @@ +# Copyright Statement: +# +# This software/firmware and related documentation ("MediaTek Software") are +# protected under relevant copyright laws. The information contained herein +# is confidential and proprietary to MediaTek Inc. and/or its licensors. +# Without the prior written permission of MediaTek inc. and/or its licensors, +# any reproduction, modification, use or disclosure of MediaTek Software, +# and information contained herein, in whole or in part, shall be strictly prohibited. +# +# MediaTek Inc. (C) 2011-2014. All rights reserved. +# +# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON +# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH +# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES +# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES +# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK +# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR +# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND +# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO +# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +# +# The following software/firmware and/or related documentation ("MediaTek Software") +# have been modified by MediaTek Inc. All revisions are subject to any receiver's +# applicable license agreements with MediaTek Inc. + +ifeq ($(MTK_FM_SUPPORT),yes) +ifeq ($(MTK_FM_RX_SUPPORT),yes) + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_CERTIFICATE := platform + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := FmRadio +LOCAL_JNI_SHARED_LIBRARIES := libfmjni + +LOCAL_PROGUARD_ENABLED := disabled +LOCAL_PRIVILEGED_MODULE := true + +LOCAL_JAVA_LIBRARIES += mediatek-framework + +ifeq ($(strip $(MTK_BSP_PACKAGE)),yes) + LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext + LOCAL_SRC_FILES += bsp/com/mediatek/fmradio/ExtensionUtils.java +else + LOCAL_STATIC_JAVA_LIBRARIES := com.mediatek.fmradio.ext + LOCAL_SRC_FILES += turnkey/com/mediatek/fmradio/ExtensionUtils.java +endif + +include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) + +endif +endif diff --git a/MediaTek/FmRadio/AndroidManifest.xml b/MediaTek/FmRadio/AndroidManifest.xml new file mode 100755 index 0000000..8cc32cc --- /dev/null +++ b/MediaTek/FmRadio/AndroidManifest.xml @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.mediatek.fmradio" + android:versionCode="1" + android:versionName="1.0"> + + <uses-permission android:name="android.permission.ACCESS_FM_RADIO" /> + <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="android.permission.READ_PHONE_STATE" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.RECORD_AUDIO" /> + <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> + <uses-permission android:name="android.permission.BLUETOOTH" /> +<!-- Vanzo:libing on: Tue, 10 Feb 2015 16:24:03 +0800 + add for gesture +--> + <uses-permission android:name="android.permission.GET_TASKS" /> +<!-- End of Vanzo:libing --> + + <application android:hardwareAccelerated="true" + android:icon="@drawable/ic_launcher" + android:theme="@style/AppTheme" + android:label="@string/app_name" + android:supportsRtl="true"> + + <activity android:name=".FmRadioActivity" + android:clearTaskOnLaunch="true" + android:configChanges="orientation|mcc|mnc|screenSize" + android:label="@string/app_name" + android:launchMode="singleTask"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity android:name=".FmRadioFavorite" + android:configChanges="orientation|screenSize" + android:label="@string/favorite_manager" + android:windowSoftInputMode="stateAlwaysHidden"> + </activity> + + <activity + android:clearTaskOnLaunch="true" + android:configChanges="orientation|screenSize" + android:label="@string/app_name" + android:launchMode="singleTask" + android:name=".FmRadioEmActivity" > + <intent-filter > + <action android:name="com.mediatek.fmradio.FmRadioEmActivity" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + +<!-- Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:34:43 +0800 + * vanzo factory mode porting +--> + <activity android:name=".TestFM" + android:screenOrientation="portrait"> + <intent-filter> + <action android:name="com.mediatek.FMRadio.test" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </activity> +<!-- End of Vanzo:yujianpeng --> + <service android:name=".FmRadioService" + android:exported="false"> + <intent-filter> + <action android:name="com.mediatek.fmradio.IFmRadioService" /> + </intent-filter> + </service> + + <provider android:name=".FmRadioContentProvider" + android:authorities="com.mediatek.fmradio.FmRadioContentProvider"> + </provider> + + </application> + +</manifest> diff --git a/MediaTek/FmRadio/NOTICE b/MediaTek/FmRadio/NOTICE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/MediaTek/FmRadio/NOTICE diff --git a/MediaTek/FmRadio/README b/MediaTek/FmRadio/README new file mode 100755 index 0000000..5ec36fe --- /dev/null +++ b/MediaTek/FmRadio/README @@ -0,0 +1,30 @@ +APK of listening the FM radio programme, including listen a station, change station, +and record a station. + +This library is pre-built by MediaTek internal. + +WHAT IT DOES? +============= +FmRadio.apk listen the FM radio programme. +1. listen a FM radio station +2. change station +3. search stations +4. record a station +5. add station to favorite + +HOW IT WAS BUILT? +================== +It needs the following library from AOSP: +1. framework.jar + +and the following libs from MediaTek: +1. mediatek-framework.jar +2. com.mediatek.fmradio.ext.jar +3. libfmjni.so + +All source/dependency modules of this module are already put in +'vendor/mediatek/libs' folder. + +HOW TO USE IT? +============== +install FmRadio.apk in mediatek platform. diff --git a/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java b/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java new file mode 100755 index 0000000..962e387 --- /dev/null +++ b/MediaTek/FmRadio/bsp/com/mediatek/fmradio/ExtensionUtils.java @@ -0,0 +1,49 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.Context; +import com.mediatek.fmradio.ext.IProjectStringExt; +import com.mediatek.fmradio.ext.DefaultProjectStringExt; + +public class ExtensionUtils { + public static IProjectStringExt getExtension(Context context) { + return new DefaultProjectStringExt(); + } + +} diff --git a/MediaTek/FmRadio/ext/Android.mk b/MediaTek/FmRadio/ext/Android.mk new file mode 100755 index 0000000..d5eef9f --- /dev/null +++ b/MediaTek/FmRadio/ext/Android.mk @@ -0,0 +1,12 @@ + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE := com.mediatek.fmradio.ext + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +include $(BUILD_STATIC_JAVA_LIBRARY) + + diff --git a/MediaTek/FmRadio/ext/NOTICE b/MediaTek/FmRadio/ext/NOTICE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/MediaTek/FmRadio/ext/NOTICE diff --git a/MediaTek/FmRadio/ext/README b/MediaTek/FmRadio/ext/README new file mode 100755 index 0000000..163ce0f --- /dev/null +++ b/MediaTek/FmRadio/ext/README @@ -0,0 +1,25 @@ +The FM radio plugin host side. + +This library is pre-built by MediaTek internal. + +WHAT IT DOES? +============= +The FM Radio plugin host is designed to change some strings +for vendor customing. It contains: +1. Plugin host API +2. A default implement + +HOW IT WAS BUILT? +================== +It needs the following library from AOSP: +No need. + +and the following libs from MediaTek: +No need. + +All source/dependency modules of this module are already put in +'vendor/mediatek/libs' folder. + +HOW TO USE IT? +============== +Install FmRadio.apk and plugin apk in mediatek platform. diff --git a/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java new file mode 100755 index 0000000..3a7dbf9 --- /dev/null +++ b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/DefaultProjectStringExt.java @@ -0,0 +1,46 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.ext; + +import android.content.Context; +public class DefaultProjectStringExt implements IProjectStringExt { + + public String getProjectString(Context context, int normalResId, int cmccResId) { + return context.getString(normalResId); + } +} diff --git a/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java new file mode 100755 index 0000000..cfcdee0 --- /dev/null +++ b/MediaTek/FmRadio/ext/src/com/mediatek/fmradio/ext/IProjectStringExt.java @@ -0,0 +1,45 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.ext; + +import android.content.Context; + +public interface IProjectStringExt { + + public String getProjectString(Context context, int normalResId, int cmccResId); +} diff --git a/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png Binary files differnew file mode 100755 index 0000000..c38132d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/bg_rec_infobar.9.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png Binary files differnew file mode 100755 index 0000000..4985b08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/bottom_bar.9.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..24ef191 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..f786a6f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..942722e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..fecb1af --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..2032636 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..811f015 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..61a466e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..d05cc32 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..a7e326a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..ae7d400 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png Binary files differnew file mode 100755 index 0000000..02bf8e0 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png Binary files differnew file mode 100755 index 0000000..af02bf8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_overflow_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..46c1afe --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..8e5454f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..6b3a5e4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..1e4601b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png Binary files differnew file mode 100755 index 0000000..068eecb --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png Binary files differnew file mode 100755 index 0000000..e5a34bf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_rec_stop_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png Binary files differnew file mode 100755 index 0000000..75d6ac1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png Binary files differnew file mode 100755 index 0000000..e674d07 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_record_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png Binary files differnew file mode 100755 index 0000000..067397a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png Binary files differnew file mode 100755 index 0000000..4ce7da3 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_start_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png Binary files differnew file mode 100755 index 0000000..3e104c0 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png Binary files differnew file mode 100755 index 0000000..3b102e5 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/btn_fm_stop_disable.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..2309234 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png Binary files differnew file mode 100755 index 0000000..9a69528 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/fm_title_icon.png diff --git a/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..f2b54b7 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-hdpi/ic_launcher.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..009b4ba --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..a66f36d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..eeab430 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..61cfb69 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..41941f7 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..b021ca4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..73fecf2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..498489f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..c0de4ef --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..cf6dbcf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png Binary files differnew file mode 100755 index 0000000..5c1b6f9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png Binary files differnew file mode 100755 index 0000000..21669ab --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_overflow_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..d25704f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..84fad14 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..8e74448 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..c1137f9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png Binary files differnew file mode 100755 index 0000000..efbc115 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png Binary files differnew file mode 100755 index 0000000..13e35a1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_rec_stop_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png Binary files differnew file mode 100755 index 0000000..c208f73 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png Binary files differnew file mode 100755 index 0000000..3f27dd0 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_record_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png Binary files differnew file mode 100755 index 0000000..17a20c2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png Binary files differnew file mode 100755 index 0000000..da098e8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_start_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png Binary files differnew file mode 100755 index 0000000..2650185 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png Binary files differnew file mode 100755 index 0000000..01b9a95 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/btn_fm_stop_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..20c55ad --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png Binary files differnew file mode 100755 index 0000000..672e050 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/fm_title_icon.png diff --git a/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..fc1da78 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldpi/ic_launcher.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..6b3ac01 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..c3c46be --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..0c67050 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..4d68e66 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..6bf78a9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..0812c1b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..ac7d6b0 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..c402fa1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..1b4276d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..0b787c1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..6ecb091 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..6cb1a31 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..44b5107 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-hdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..65d407e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..880b55f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..d8cfbd3 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..41197c0 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..b0fc9e1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..47e9a70 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..acd9c45 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..5318e4b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..abe6eb2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..14ccbeb --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..1a4aa77 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..f4a63ee --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-ldpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..bcd0611 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..f75b2de --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..8c7cc8b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..fb5875d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..b88d8a9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..9813971 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..162164c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..1b95d49 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..7c6e06a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..e9ca061 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..d1447fb --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..3d0dfef --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..28e09d3 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-mdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..9a44bf3 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..dbcb0cf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..877bb86 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..b53e3ad --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..a6313e2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..5064901 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..a0d9bd9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..5aa0d07 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..2933bd4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..b042212 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..27593fc --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..cf165ec --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..70791f5 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xhdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..9a44bf3 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..dbcb0cf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..877bb86 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..b53e3ad --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..a6313e2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..5064901 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..a0d9bd9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..5aa0d07 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..2933bd4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..b042212 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..27593fc --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..cf165ec --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..70791f5 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl-xxhdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml b/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml new file mode 100755 index 0000000..ea41e38 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-ldrtl/anim.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<set xmlns:android="http://schemas.android.com/apk/res/android"> +<translate + android:repeatCount="1000" + android:fromXDelta="180%p" + android:toXDelta="-100%p" + android:duration="500" + /> +</set>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png Binary files differnew file mode 100755 index 0000000..c38132d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/bg_rec_infobar.9.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png Binary files differnew file mode 100755 index 0000000..4985b08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/bottom_bar.9.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..0111567 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..de3e323 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..05563bf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..c0c6b49 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..772530f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..f362f89 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..5eaf0ba --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..8fe43b4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..01fbc5a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..997485f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png Binary files differnew file mode 100755 index 0000000..80e2504 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png Binary files differnew file mode 100755 index 0000000..3a7bab7 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_overflow_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..1fe787f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..71803b8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..4e1fe7f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..48ee750 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png Binary files differnew file mode 100755 index 0000000..b54058f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png Binary files differnew file mode 100755 index 0000000..08f8388 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_rec_stop_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png Binary files differnew file mode 100755 index 0000000..0b464d2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png Binary files differnew file mode 100755 index 0000000..026b9d1 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_record_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png Binary files differnew file mode 100755 index 0000000..ff53bb9 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png Binary files differnew file mode 100755 index 0000000..1bbfb9e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_start_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png Binary files differnew file mode 100755 index 0000000..134807f --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png Binary files differnew file mode 100755 index 0000000..f9b804a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/btn_fm_stop_disable.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..116af88 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png Binary files differnew file mode 100755 index 0000000..2f38c87 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/fm_title_icon.png diff --git a/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..d1cb30b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-mdpi/ic_launcher.png diff --git a/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..05563bf --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..c0c6b49 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-sw1024dp-ldpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png Binary files differnew file mode 100755 index 0000000..c38132d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/bg_rec_infobar.9.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png Binary files differnew file mode 100755 index 0000000..4985b08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/bottom_bar.9.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..4dd4042 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..06fe97c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..c591cae --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..8f14270 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..45ce276 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..16b948e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..3028829 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..8ce3d27 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..07f4c44 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..9929646 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png Binary files differnew file mode 100755 index 0000000..3902d93 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png Binary files differnew file mode 100755 index 0000000..9494074 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_overflow_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..0b38c7a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..7743e11 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..dead2bd --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..bb9582a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png Binary files differnew file mode 100755 index 0000000..4bef4e8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png Binary files differnew file mode 100755 index 0000000..d2c6c90 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_rec_stop_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png Binary files differnew file mode 100755 index 0000000..96590b2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png Binary files differnew file mode 100755 index 0000000..8c97fcd --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_record_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png Binary files differnew file mode 100755 index 0000000..e6c0f6b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png Binary files differnew file mode 100755 index 0000000..4fdda08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_start_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png Binary files differnew file mode 100755 index 0000000..68135bc --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png Binary files differnew file mode 100755 index 0000000..bc88941 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/btn_fm_stop_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..420dc9c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png Binary files differnew file mode 100755 index 0000000..a8d9f5d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/fm_title_icon.png diff --git a/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..c11060e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xhdpi/ic_launcher.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png b/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png Binary files differnew file mode 100755 index 0000000..c38132d --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/bg_rec_infobar.9.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png b/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png Binary files differnew file mode 100755 index 0000000..4985b08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/bottom_bar.9.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png Binary files differnew file mode 100755 index 0000000..4dd4042 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png Binary files differnew file mode 100755 index 0000000..06fe97c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_decrease_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png Binary files differnew file mode 100755 index 0000000..c591cae --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_off.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png Binary files differnew file mode 100755 index 0000000..8f14270 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_favorite_on.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png Binary files differnew file mode 100755 index 0000000..45ce276 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png Binary files differnew file mode 100755 index 0000000..16b948e --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_increase_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png Binary files differnew file mode 100755 index 0000000..3028829 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png Binary files differnew file mode 100755 index 0000000..8ce3d27 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_list_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png Binary files differnew file mode 100755 index 0000000..07f4c44 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png Binary files differnew file mode 100755 index 0000000..9929646 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_nextstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png Binary files differnew file mode 100755 index 0000000..3902d93 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png Binary files differnew file mode 100755 index 0000000..9494074 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_overflow_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png Binary files differnew file mode 100755 index 0000000..0b38c7a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png Binary files differnew file mode 100755 index 0000000..7743e11 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_prevstation_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png Binary files differnew file mode 100755 index 0000000..dead2bd --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png Binary files differnew file mode 100755 index 0000000..bb9582a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_playback_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png Binary files differnew file mode 100755 index 0000000..4bef4e8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png Binary files differnew file mode 100755 index 0000000..d2c6c90 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_rec_stop_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png Binary files differnew file mode 100755 index 0000000..96590b2 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_disabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png Binary files differnew file mode 100755 index 0000000..8c97fcd --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_record_enabled.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png Binary files differnew file mode 100755 index 0000000..e6c0f6b --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png Binary files differnew file mode 100755 index 0000000..4fdda08 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_start_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png Binary files differnew file mode 100755 index 0000000..68135bc --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png Binary files differnew file mode 100755 index 0000000..bc88941 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/btn_fm_stop_disable.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png Binary files differnew file mode 100755 index 0000000..420dc9c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_anim.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png Binary files differnew file mode 100755 index 0000000..1ba5028 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/fm_title_icon.png diff --git a/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png b/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100755 index 0000000..964da33 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable-xxhdpi/ic_launcher.png diff --git a/MediaTek/FmRadio/res/drawable/anim.xml b/MediaTek/FmRadio/res/drawable/anim.xml new file mode 100755 index 0000000..dcd3738 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/anim.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android"> +<translate + android:repeatCount="1000" + android:fromXDelta="-80%p" + android:toXDelta="100%p" + android:duration="500" + /> +</set>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml b/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml new file mode 100755 index 0000000..fa6f858 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_decrease_frequency.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_decrease" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_decrease_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml new file mode 100755 index 0000000..0d526d4 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_off_selector.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/btn_fm_favorite_off" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml new file mode 100755 index 0000000..08e2c5c --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_favorite_on_selector.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/btn_fm_favorite_on" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml b/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml new file mode 100755 index 0000000..d31c0cc --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_increase_frequency.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_increase" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_increase_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml new file mode 100755 index 0000000..8fbcb87 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_list_selector.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_list" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_list_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_next.xml b/MediaTek/FmRadio/res/drawable/btn_fm_next.xml new file mode 100755 index 0000000..6ecc323 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_next.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_nextstation" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_nextstation_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml new file mode 100755 index 0000000..a3c6410 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_overflow_selector.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_overflow" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_overflow_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml new file mode 100755 index 0000000..ccce13a --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_powerdown_selector.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_stop" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_stop_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml b/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml new file mode 100755 index 0000000..a81c592 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_powerup_selector.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_start" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_start_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml b/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml new file mode 100755 index 0000000..dc7c9b5 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_previous.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_prevstation" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_prevstation_disable" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml b/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml new file mode 100755 index 0000000..9bf10d8 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_rec_play.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_rec_playback_enabled" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_rec_playback_disabled" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml b/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml new file mode 100755 index 0000000..c954bee --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_rec_stop.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_rec_stop_enabled" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_rec_stop_disabled" /> +</selector> diff --git a/MediaTek/FmRadio/res/drawable/btn_fm_record.xml b/MediaTek/FmRadio/res/drawable/btn_fm_record.xml new file mode 100755 index 0000000..ae54431 --- /dev/null +++ b/MediaTek/FmRadio/res/drawable/btn_fm_record.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:drawable="@drawable/btn_fm_record_enabled" /> + <item android:state_enabled="false" + android:drawable="@drawable/btn_fm_record_disabled" /> +</selector> diff --git a/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml b/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml new file mode 100755 index 0000000..78032de --- /dev/null +++ b/MediaTek/FmRadio/res/layout-ldrtl/addstation.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:id="@+id/layout_add_station" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textDirection="locale"> +<TextView + android:id="@+id/dlg_add_station_name" + android:text="@string/dlg_addedit_station_name" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:gravity="center_vertical"/> +<EditText + android:layout_toEndOf="@+id/dlg_add_station_name" + android:layout_height="50dip" + android:id="@+id/dlg_add_station_name_text" + android:layout_width="fill_parent" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:layout_marginEnd="10dip" + android:maxLength="15" + android:inputType="textPersonName" + android:gravity="center_vertical" + android:textDirection="locale"></EditText> +<TextView + android:id="@+id/dlg_add_station_freq" + android:text="@string/dlg_addedit_station_freq" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:layout_below="@+id/dlg_add_station_name" + android:gravity="center_vertical"/> +<TextView + android:id="@+id/dlg_add_station_freq_text" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:layout_below="@+id/dlg_add_station_name" + android:layout_toEndOf="@+id/dlg_add_station_freq" + android:gravity="center_vertical"/> +</RelativeLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml b/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml new file mode 100755 index 0000000..3ed5acb --- /dev/null +++ b/MediaTek/FmRadio/res/layout-ldrtl/editstation.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:id="@+id/layout_edit_station" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textDirection="locale"> +<TextView + android:id="@+id/dlg_edit_station_name" + android:text="@string/dlg_addedit_station_name" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:gravity="center_vertical"/> +<EditText + android:id="@+id/dlg_edit_station_name_text" + android:layout_width="match_parent" + android:layout_height="50dip" + android:layout_marginStart="10dip" + android:layout_marginEnd="10dip" + android:layout_toEndOf="@+id/dlg_edit_station_name" + android:gravity="center_vertical" + android:inputType="textPersonName" + android:maxLength="15" + android:singleLine="true" + android:textStyle="bold" + android:textDirection="locale"> +</EditText> +<TextView + android:id="@+id/dlg_edit_station_freq" + android:text="@string/dlg_addedit_station_freq" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:layout_below="@+id/dlg_edit_station_name" + android:gravity="center_vertical"/> +<EditText + android:id="@+id/dlg_edit_station_freq_text" + android:layout_width="match_parent" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginStart="10dip" + android:inputType="numberDecimal" + android:layout_below="@+id/dlg_edit_station_name" + android:layout_toEndOf="@+id/dlg_edit_station_freq" + android:gravity="center_vertical" + android:textDirection="locale"/> +</RelativeLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml b/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml new file mode 100755 index 0000000..35f92f2 --- /dev/null +++ b/MediaTek/FmRadio/res/layout-ldrtl/fm_recorder_dialog.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/fm_recording_layout" + android:orientation="vertical" + android:layout_width="286dp" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/fm_recording_title_bar" + style="?android:attr/windowTitleStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="53dp" + android:padding="10dp" + android:singleLine="true" + android:gravity="right" + android:text="@string/dlg_save_recording_title"/> + <View + android:id="@+id/divider" + android:layout_width="match_parent" + android:layout_height="2dp" + android:background="#31b6e7" /> + <LinearLayout + android:id="@+id/contentPanel" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center"> + <TextView + android:id="@+id/save_recording_storage_warning" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:paddingLeft="12dip" + android:paddingRight="12dip" + android:text="@string/dlg_save_recording_storage_warning" + style="?android:attr/textAppearanceMedium"/> + </LinearLayout> + <LinearLayout + android:id="@+id/contentPanel" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="68dp" + android:gravity="center"> + <EditText + android:id="@+id/fm_recording_text" + android:layout_width="265dp" + android:layout_height="wrap_content" + android:singleLine="true" + android:maxLength="80" + android:textDirection="locale"/> + </LinearLayout> + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="#424542" /> + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + <Button + android:id="@+id/fm_recording_btn_discard" + style="?android:attr/buttonBarButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_discard_recording"/> + + <View + android:layout_width="1dp" + android:layout_height="match_parent" + android:background="#424542" /> + <Button + android:id="@+id/fm_recording_btn_save" + style="?android:attr/buttonBarButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_save_recording"/> + + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout-ldrtl/main.xml b/MediaTek/FmRadio/res/layout-ldrtl/main.xml new file mode 100755 index 0000000..e2ea4dc --- /dev/null +++ b/MediaTek/FmRadio/res/layout-ldrtl/main.xml @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/main_view" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="vertical" > + <!-- middle part starts --> + + <RelativeLayout + android:id="@+id/rl_middlepart" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottombar_parent"> + + <TextView + android:id="@+id/station_name" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_above="@+id/station_value" + android:gravity="center" + android:singleLine="true" + android:textSize="20dip" + android:textStyle="bold" > + </TextView> + + <TextView + android:id="@+id/text_fm" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_below="@+id/station_name" + android:layout_toStartOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="20dip" + android:textStyle="bold" > + </TextView> + + <TextView + android:id="@+id/station_value" + android:layout_width="160dip" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:gravity="center_horizontal" + android:textSize="60dip" + android:textStyle="bold" > + </TextView> + + <TextView + android:id="@+id/text_mhz" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/station_value" + android:layout_below="@+id/station_name" + android:layout_toEndOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="20dip" + android:textStyle="bold" > + </TextView> + + <TextView + android:id="@+id/text_rds" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/station_value" + android:ellipsize="marquee" + android:gravity="center_horizontal" + android:marqueeRepeatLimit="marquee_forever" + android:singleLine="true" + android:textColor="#BBBBBB" + android:textSize="20dip" + android:textStyle="bold" > + </TextView> + + <ImageButton + android:id="@+id/button_add_to_favorite" + android:layout_marginStart="15dip" + android:layout_width="50dip" + android:layout_height="42dip" + android:layout_alignTop="@+id/text_mhz" + android:layout_toEndOf="@+id/station_value" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_favorite_off" + android:enabled="false"> + </ImageButton> + </RelativeLayout> + + <!-- middle part ends --> + + <LinearLayout + android:id="@+id/bottombar_parent" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" > + + <LinearLayout + android:id="@+id/bottom_bar" + android:layout_width="fill_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:splitMotionEvents="false" + android:weightSum="4" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/button_prevstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="?android:attr/buttonBarButtonStyle" + android:layout_weight="1" + android:adjustViewBounds="true" + android:src="@drawable/btn_fm_previous" + android:enabled="false"/> + + <ImageButton + android:id="@+id/button_decrease" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_decrease_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_increase" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_increase_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_nextstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_next" + android:enabled="false" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/bottom_bar_recorder" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:visibility="gone" + android:splitMotionEvents="false" + android:weightSum="3" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/btn_record" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_record" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_stop" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_stop" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_playback" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_play" + android:enabled="false"/> + </LinearLayout> + </LinearLayout> + + <RelativeLayout + android:id="@+id/rl_recinfo" + android:layout_width="match_parent" + android:layout_height="48dip" + android:layout_above="@id/bottombar_parent" + android:background="@drawable/bg_rec_infobar" + android:gravity="right" + android:paddingStart="5dip" + android:paddingEnd="5dip" + android:visibility="gone" > + + <TextView + android:id="@+id/txtRecInfoLeft" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_toStartOf="@+id/txtRecInfoRight" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="#ffffff" + android:textSize="20sp" + android:gravity="right" + android:textStyle="normal" > + </TextView> + + <TextView + android:id="@+id/txtRecInfoRight" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_marginStart="20dip" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal"> + </TextView> + </RelativeLayout> + + <LinearLayout + android:id="@+id/anim_background" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_above="@id/rl_recinfo" > + + <ImageView + android:id="@+id/iv_anim" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/fm_anim" + android:visibility="invisible" /> + </LinearLayout> + +</RelativeLayout> diff --git a/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml b/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml new file mode 100755 index 0000000..b0c2449 --- /dev/null +++ b/MediaTek/FmRadio/res/layout-sw1024dp-land/main.xml @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/main_view" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <!-- middle part starts --> + + <RelativeLayout + android:id="@+id/rl_middlepart" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottombar_parent"> + + <TextView + android:id="@+id/station_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@+id/station_value" + android:gravity="center" + android:singleLine="true" + android:textSize="20dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_fm" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_below="@+id/station_name" + android:layout_toLeftOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="30dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/station_value" + android:layout_width="240dip" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:gravity="center_horizontal" + android:textSize="80dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_mhz" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/station_value" + android:layout_below="@+id/station_name" + android:layout_toRightOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="30dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_rds" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/station_value" + android:ellipsize="marquee" + android:gravity="center_horizontal" + android:marqueeRepeatLimit="marquee_forever" + android:singleLine="true" + android:textColor="#BBBBBB" + android:textSize="20dip" + android:textStyle="bold" /> + + <ImageButton + android:id="@+id/button_add_to_favorite" + android:layout_marginLeft="15dip" + android:layout_width="50dip" + android:layout_height="42dip" + android:layout_alignTop="@+id/text_mhz" + android:layout_toRightOf="@+id/station_value" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_favorite_off" + android:enabled="false" /> + </RelativeLayout> + + <!-- middle part ends --> + + <LinearLayout + android:id="@+id/bottombar_parent" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" > + + <LinearLayout + android:id="@+id/bottom_bar" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:splitMotionEvents="false" + android:weightSum="4" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/button_prevstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="?android:attr/buttonBarButtonStyle" + android:layout_weight="1" + android:adjustViewBounds="true" + android:src="@drawable/btn_fm_previous" + android:enabled="false"/> + + <ImageButton + android:id="@+id/button_decrease" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_decrease_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_increase" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_increase_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_nextstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_next" + android:enabled="false" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/bottom_bar_recorder" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:visibility="gone" + android:splitMotionEvents="false" + android:weightSum="3" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/btn_record" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_record" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_stop" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_stop" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_playback" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_play" + android:enabled="false"/> + </LinearLayout> + </LinearLayout> + + <RelativeLayout + android:id="@+id/rl_recinfo" + android:layout_width="match_parent" + android:layout_height="48dip" + android:layout_above="@id/bottombar_parent" + android:background="@drawable/bg_rec_infobar" + android:gravity="center_vertical" + android:paddingLeft="5dip" + android:paddingRight="5dip" + android:visibility="gone" > + + <TextView + android:id="@+id/txtRecInfoLeft" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_toLeftOf="@+id/txtRecInfoRight" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + + <TextView + android:id="@+id/txtRecInfoRight" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_marginLeft="20dip" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + </RelativeLayout> + + <LinearLayout + android:id="@+id/anim_background" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@id/rl_recinfo" > + + <ImageView + android:id="@+id/iv_anim" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/fm_anim" + android:visibility="invisible" /> + </LinearLayout> + +</RelativeLayout> diff --git a/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml b/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml new file mode 100755 index 0000000..b0c2449 --- /dev/null +++ b/MediaTek/FmRadio/res/layout-sw1024dp-port/main.xml @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/main_view" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <!-- middle part starts --> + + <RelativeLayout + android:id="@+id/rl_middlepart" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottombar_parent"> + + <TextView + android:id="@+id/station_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@+id/station_value" + android:gravity="center" + android:singleLine="true" + android:textSize="20dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_fm" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_below="@+id/station_name" + android:layout_toLeftOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="30dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/station_value" + android:layout_width="240dip" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:gravity="center_horizontal" + android:textSize="80dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_mhz" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/station_value" + android:layout_below="@+id/station_name" + android:layout_toRightOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="30dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_rds" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/station_value" + android:ellipsize="marquee" + android:gravity="center_horizontal" + android:marqueeRepeatLimit="marquee_forever" + android:singleLine="true" + android:textColor="#BBBBBB" + android:textSize="20dip" + android:textStyle="bold" /> + + <ImageButton + android:id="@+id/button_add_to_favorite" + android:layout_marginLeft="15dip" + android:layout_width="50dip" + android:layout_height="42dip" + android:layout_alignTop="@+id/text_mhz" + android:layout_toRightOf="@+id/station_value" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_favorite_off" + android:enabled="false" /> + </RelativeLayout> + + <!-- middle part ends --> + + <LinearLayout + android:id="@+id/bottombar_parent" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" > + + <LinearLayout + android:id="@+id/bottom_bar" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:splitMotionEvents="false" + android:weightSum="4" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/button_prevstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="?android:attr/buttonBarButtonStyle" + android:layout_weight="1" + android:adjustViewBounds="true" + android:src="@drawable/btn_fm_previous" + android:enabled="false"/> + + <ImageButton + android:id="@+id/button_decrease" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_decrease_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_increase" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_increase_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_nextstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_next" + android:enabled="false" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/bottom_bar_recorder" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:visibility="gone" + android:splitMotionEvents="false" + android:weightSum="3" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/btn_record" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_record" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_stop" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_stop" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_playback" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_play" + android:enabled="false"/> + </LinearLayout> + </LinearLayout> + + <RelativeLayout + android:id="@+id/rl_recinfo" + android:layout_width="match_parent" + android:layout_height="48dip" + android:layout_above="@id/bottombar_parent" + android:background="@drawable/bg_rec_infobar" + android:gravity="center_vertical" + android:paddingLeft="5dip" + android:paddingRight="5dip" + android:visibility="gone" > + + <TextView + android:id="@+id/txtRecInfoLeft" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_toLeftOf="@+id/txtRecInfoRight" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + + <TextView + android:id="@+id/txtRecInfoRight" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_marginLeft="20dip" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + </RelativeLayout> + + <LinearLayout + android:id="@+id/anim_background" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@id/rl_recinfo" > + + <ImageView + android:id="@+id/iv_anim" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/fm_anim" + android:visibility="invisible" /> + </LinearLayout> + +</RelativeLayout> diff --git a/MediaTek/FmRadio/res/layout/addstation.xml b/MediaTek/FmRadio/res/layout/addstation.xml new file mode 100755 index 0000000..c895051 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/addstation.xml @@ -0,0 +1,80 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/layout_add_station" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/dlg_add_station_name" + android:text="@string/dlg_addedit_station_name" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:gravity="center_vertical"/> + <EditText + android:layout_toRightOf="@+id/dlg_add_station_name" + android:layout_height="50dip" + android:id="@+id/dlg_add_station_name_text" + android:layout_width="match_parent" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:layout_marginRight="10dip" + android:maxLength="15" + android:inputType="textPersonName" + android:gravity="center_vertical"/> + <TextView + android:id="@+id/dlg_add_station_freq" + android:text="@string/dlg_addedit_station_freq" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:layout_below="@+id/dlg_add_station_name" + android:gravity="center_vertical"/> + <TextView + android:id="@+id/dlg_add_station_freq_text" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:layout_below="@+id/dlg_add_station_name" + android:layout_toRightOf="@+id/dlg_add_station_freq" + android:gravity="center_vertical"/> +</RelativeLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout/editstation.xml b/MediaTek/FmRadio/res/layout/editstation.xml new file mode 100755 index 0000000..a08d798 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/editstation.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/layout_edit_station" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/dlg_edit_station_name" + android:text="@string/dlg_addedit_station_name" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:gravity="center_vertical"/> + <EditText + android:id="@+id/dlg_edit_station_name_text" + android:layout_width="match_parent" + android:layout_height="50dip" + android:layout_marginLeft="10dip" + android:layout_marginRight="10dip" + android:layout_toRightOf="@+id/dlg_edit_station_name" + android:gravity="center_vertical" + android:inputType="textPersonName" + android:maxLength="15" + android:singleLine="true" + android:textStyle="bold" /> + <TextView + android:id="@+id/dlg_edit_station_freq" + android:text="@string/dlg_addedit_station_freq" + android:layout_width="wrap_content" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:layout_below="@+id/dlg_edit_station_name" + android:gravity="center_vertical"/> + <EditText + android:id="@+id/dlg_edit_station_freq_text" + android:layout_width="match_parent" + android:layout_height="50dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:inputType="numberDecimal" + android:layout_below="@+id/dlg_edit_station_name" + android:layout_toRightOf="@+id/dlg_edit_station_freq" + android:gravity="center_vertical"/> +</RelativeLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout/favorite.xml b/MediaTek/FmRadio/res/layout/favorite.xml new file mode 100755 index 0000000..e6a0f48 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/favorite.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/favorite_view" + android:layout_width="match_parent" + android:layout_height="match_parent" > + + <ListView + android:id="@+id/station_list" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <TextView + android:id="@+id/empty" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/empty_list" + android:visibility="gone" + android:gravity="center" + android:textSize="20sp"/> +</RelativeLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml b/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml new file mode 100755 index 0000000..6b083a0 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/fm_recorder_dialog.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/fm_recording_layout" + android:orientation="vertical" + android:layout_width="286dp" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/fm_recording_title_bar" + style="?android:attr/windowTitleStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="53dp" + android:padding="10dp" + android:singleLine="true" + android:gravity="center|left" + android:text="@string/dlg_save_recording_title"/> + <View + android:id="@+id/divider" + android:layout_width="match_parent" + android:layout_height="2dp" + android:background="#31b6e7" /> + <LinearLayout + android:id="@+id/contentPanel" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center"> + <TextView + android:id="@+id/save_recording_storage_warning" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:paddingLeft="12dip" + android:paddingRight="12dip" + android:text="@string/dlg_save_recording_storage_warning" + style="?android:attr/textAppearanceMedium"/> + </LinearLayout> + <LinearLayout + android:id="@+id/contentPanel" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="68dp" + android:gravity="center"> + <EditText + android:id="@+id/fm_recording_text" + android:layout_width="265dp" + android:layout_height="wrap_content" + android:singleLine="true" + android:maxLength="80"/> + </LinearLayout> + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="#424542" /> + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + <Button + android:id="@+id/fm_recording_btn_discard" + style="?android:attr/buttonBarButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_discard_recording"/> + + <View + android:layout_width="1dp" + android:layout_height="match_parent" + android:background="#424542" /> + <Button + android:id="@+id/fm_recording_btn_save" + style="?android:attr/buttonBarButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/btn_save_recording"/> + + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout/fm_rx_em.xml b/MediaTek/FmRadio/res/layout/fm_rx_em.xml new file mode 100755 index 0000000..4a4da7c --- /dev/null +++ b/MediaTek/FmRadio/res/layout/fm_rx_em.xml @@ -0,0 +1,789 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:custom="http://FMTransmitter.mediatek.com/custom" + android:layout_width="fill_parent" + android:layout_height="fill_parent" > + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="vertical" > + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:id="@+id/FMR_Freq_text" + android:layout_width="110dip" + android:layout_height="wrap_content" + android:layout_marginLeft="5dip" + android:layout_marginTop="6dip" + android:text="@string/FMR_Freq_text" /> + + <EditText + android:id="@+id/FMR_Freq_edit" + android:layout_width="96dip" + android:layout_height="48dip" + android:layout_centerHorizontal="true" + android:layout_marginTop="6dip" + android:maxLength="10" + android:singleLine="true" /> + + <Button + android:id="@+id/FMR_Freq_tune" + android:layout_width="84dip" + android:layout_height="48dip" + android:layout_marginTop="6dip" + android:text="@string/FMR_Freq_tune" /> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="10dip" > + + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Antenna_text" > + </TextView> + + <RadioGroup + android:id="@+id/FMR_Antenna_type" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="30dip" + android:orientation="horizontal" > + + <RadioButton + android:id="@+id/FMR_Antenna_short" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/FMR_Antenna_short" > + </RadioButton> + + <RadioButton + android:id="@+id/FMR_Antenna_long" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="30dip" + android:text="@string/FMR_Antenna_long" > + </RadioButton> + </RadioGroup> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="10dip" > + + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Force_Stereomono_text" > + </TextView> + + <RadioGroup + android:id="@+id/FMR_Stereomono_type" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="30dip" + android:orientation="horizontal" > + + <RadioButton + android:id="@+id/FMR_Stereomono_stereo" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/FMR_Stereomono_stereo" > + </RadioButton> + + <RadioButton + android:id="@+id/FMR_Stereomono_mono" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="30dip" + android:text="@string/FMR_Stereomono_mono" > + </RadioButton> + </RadioGroup> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="#001515" + android:orientation="vertical" + android:padding="10dip" > + + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_text" > + </TextView> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_Stereomono_text" > + </TextView> + + <TextView + android:id="@+id/FMR_Status_Stereomono" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_Stereomono" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_RSSI_text" > + </TextView> + + <TextView + android:id="@+id/FMR_Status_RSSI" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_RSSI" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_Caparray_text" > + </TextView> + + <TextView + android:id="@+id/FMR_Status_Caparray" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Status_Caparray" > + </TextView> + </LinearLayout> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="#151500" + android:orientation="vertical" + android:padding="10dip" > + + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_text" > + </TextView> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_Ratio_text" > + </TextView> + + <TextView + android:id="@+id/FMR_RDS_Ratio" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_Ratio" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_PS_text" > + </TextView> + + <TextView + android:id="@+id/FMR_RDS_PS" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_PS" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_RT_text" > + </TextView> + + <TextView + android:id="@+id/FMR_RDS_RT" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_RDS_RT" > + </TextView> + </LinearLayout> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="#151500" + android:orientation="vertical" + android:padding="10dip" > + + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Hardware_version" > + </TextView> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_Chip_ID_text" > + </TextView> + + <TextView + android:id="@+id/FMR_Chip_ID" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Chip_ID" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_ECO_Version_text" > + </TextView> + + <TextView + android:id="@+id/FMR_ECO_Version" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_ECO_Version" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_Patch_Version_text" > + </TextView> + + <TextView + android:id="@+id/FMR_Patch_Version" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_Patch_Version" > + </TextView> + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_DSP_Version_text" > + </TextView> + + <TextView + android:id="@+id/FMR_DSP_Version" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_DSP_Version" > + </TextView> + </LinearLayout> + </LinearLayout> + <!-- FM EM new feature --> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="10dip" > + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_RSSI_THRESHOLD_text" > + </TextView> + + <EditText + android:id="@+id/FMR_EM_RSSI_THRESHOLD_edit" + android:layout_width="120dip" + android:layout_height="wrap_content" + android:maxLength="10" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + + <Button + android:id="@+id/FMR_EM_RSSI_THRESHOLD_OK" + android:layout_width="60dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_OK_TEXT" /> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_MUTE_GAIN_text" > + </TextView> + + <EditText + android:id="@+id/FMR_EM_MUTE_GAIN_edit" + android:layout_width="120dip" + android:layout_height="wrap_content" + android:maxLength="10" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + + <Button + android:id="@+id/FMR_EM_MUTE_GAIN_OK" + android:layout_width="60dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_OK_TEXT" /> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + + <TextView + android:layout_width="120dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_DESENSE_RSSI_text" > + </TextView> + + <EditText + android:id="@+id/FMR_EM_DESENSE_RSSI_edit" + android:layout_width="120dip" + android:layout_height="wrap_content" + android:maxLength="10" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + + <Button + android:id="@+id/FMR_EM_DESENSE_RSSI_OK" + android:layout_width="60dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_OK_TEXT" /> + </LinearLayout> + + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" > + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginLeft="120dip" + android:text="@string/FMR_EM_CMD_title" > + </TextView> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" > + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit0" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit1" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit2" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit3" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit4" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit5" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit6" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit7" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit8" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit9" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit10" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit11" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit12" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit13" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit14" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit15" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit16" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit17" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit18" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + <TextView + android:layout_width="17dip" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <EditText + android:id="@+id/FMR_EM_CMD_edit19" + android:layout_width="65dip" + android:layout_height="wrap_content" + android:maxLength="4" + android:text="@string/FMR_EM_DEFAULT_VALUE" > + </EditText> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + <Button + android:id="@+id/FMR_EM_CMD_OK" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_OK_TEXT" /> + </LinearLayout> + + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="10dip" > + <TextView + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginLeft="80dip" + android:text="@string/FMR_EM_CMD_return" > + </TextView> + </LinearLayout> + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="10dip" > + <TextView + android:id="@+id/FMR_EM_CMD_RETURN0" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <TextView + android:id="@+id/FMR_EM_CMD_RETURN1" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <TextView + android:id="@+id/FMR_EM_CMD_RETURN2" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <TextView + android:id="@+id/FMR_EM_CMD_RETURN3" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + <TextView + android:id="@+id/FMR_EM_CMD_RETURN4" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/FMR_EM_CMD_text" > + </TextView> + </LinearLayout> + </LinearLayout> + +</ScrollView> diff --git a/MediaTek/FmRadio/res/layout/main.xml b/MediaTek/FmRadio/res/layout/main.xml new file mode 100755 index 0000000..dc2b35f --- /dev/null +++ b/MediaTek/FmRadio/res/layout/main.xml @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/main_view" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <!-- middle part starts --> + + <RelativeLayout + android:id="@+id/rl_middlepart" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottombar_parent"> + + <TextView + android:id="@+id/station_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@+id/station_value" + android:gravity="center" + android:singleLine="true" + android:textSize="20dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_fm" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_below="@+id/station_name" + android:layout_toLeftOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="20dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/station_value" + android:layout_width="160dip" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:gravity="center_horizontal" + android:textSize="60dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_mhz" + android:layout_width="80dip" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/station_value" + android:layout_below="@+id/station_name" + android:layout_toRightOf="@+id/station_value" + android:gravity="center_horizontal" + android:textSize="20dip" + android:textStyle="bold" /> + + <TextView + android:id="@+id/text_rds" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/station_value" + android:ellipsize="marquee" + android:gravity="center_horizontal" + android:marqueeRepeatLimit="marquee_forever" + android:singleLine="true" + android:textColor="#BBBBBB" + android:textSize="20dip" + android:textStyle="bold" /> + + <ImageButton + android:id="@+id/button_add_to_favorite" + android:layout_marginLeft="15dip" + android:layout_width="50dip" + android:layout_height="42dip" + android:layout_alignTop="@+id/text_mhz" + android:layout_toRightOf="@+id/station_value" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_favorite_off" + android:enabled="false" /> + </RelativeLayout> + + <!-- middle part ends --> + + <LinearLayout + android:id="@+id/bottombar_parent" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" > + + <LinearLayout + android:id="@+id/bottom_bar" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:splitMotionEvents="false" + android:weightSum="4" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/button_prevstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + style="?android:attr/buttonBarButtonStyle" + android:layout_weight="1" + android:adjustViewBounds="true" + android:src="@drawable/btn_fm_previous" + android:enabled="false"/> + + <ImageButton + android:id="@+id/button_decrease" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_decrease_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_increase" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_increase_frequency" + android:enabled="false" /> + + <ImageButton + android:id="@+id/button_nextstation" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:adjustViewBounds="true" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_next" + android:enabled="false" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/bottom_bar_recorder" + android:layout_width="match_parent" + android:layout_height="60dip" + android:layout_alignParentBottom="true" + android:background="@drawable/bottom_bar" + android:gravity="center_vertical" + android:visibility="gone" + android:splitMotionEvents="false" + android:weightSum="3" > + + <!-- Must set the background to "btn_pressed" which is the same with what is set in source code. --> + <!-- Because if not set it, the button size will change when clicked. --> + + <ImageButton + android:id="@+id/btn_record" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_record" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_stop" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_stop" + android:enabled="false"/> + + <ImageButton + android:id="@+id/btn_playback" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + style="?android:attr/buttonBarButtonStyle" + android:src="@drawable/btn_fm_rec_play" + android:enabled="false"/> + </LinearLayout> + </LinearLayout> + + <RelativeLayout + android:id="@+id/rl_recinfo" + android:layout_width="match_parent" + android:layout_height="48dip" + android:layout_above="@id/bottombar_parent" + android:background="@drawable/bg_rec_infobar" + android:gravity="center_vertical" + android:paddingLeft="5dip" + android:paddingRight="5dip" + android:visibility="gone" > + + <TextView + android:id="@+id/txtRecInfoLeft" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_toLeftOf="@+id/txtRecInfoRight" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + + <TextView + android:id="@+id/txtRecInfoRight" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_marginLeft="20dip" + android:textColor="#ffffff" + android:textSize="20sp" + android:textStyle="normal" /> + </RelativeLayout> + + <LinearLayout + android:id="@+id/anim_background" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@id/rl_recinfo" > + + <ImageView + android:id="@+id/iv_anim" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/fm_anim" + android:visibility="invisible" /> + </LinearLayout> + +</RelativeLayout> diff --git a/MediaTek/FmRadio/res/layout/simpleadapter.xml b/MediaTek/FmRadio/res/layout/simpleadapter.xml new file mode 100755 index 0000000..9c78061 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/simpleadapter.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:gravity="center_vertical" + android:minHeight="48dip"> + <ImageView + android:id="@+id/lv_station_type" + android:adjustViewBounds="true" + android:layout_width="32dip" + android:layout_height="32dip" + android:layout_marginLeft="14dip" + android:layout_marginRight="14dip"/> + <TextView + android:id="@+id/lv_station_freq" + android:gravity="center_vertical" + android:layout_width="60dip" + android:layout_height="42dip" + android:textStyle="bold" + android:textAppearance="?android:attr/textAppearanceMedium"/> + <TextView + android:id="@+id/lv_station_name" + android:gravity="center_vertical" + android:layout_width="match_parent" + android:layout_height="42dip" + android:textStyle="bold" + android:layout_marginLeft="10dip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:singleLine="true" + android:marqueeRepeatLimit="marquee_forever" + android:ellipsize="marquee"/> +</LinearLayout>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/layout/test_view.xml b/MediaTek/FmRadio/res/layout/test_view.xml new file mode 100755 index 0000000..c26db52 --- /dev/null +++ b/MediaTek/FmRadio/res/layout/test_view.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <Button + android:id="@+id/search" + android:layout_width="match_parent" + android:layout_height="100dip" + android:textSize="30sp" + android:text="@string/test_search" + /> + <Button + android:id="@+id/success" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:textSize="30sp" + android:text="@string/test_success" /> + <Button + android:id="@+id/fail" + android:layout_width="match_parent" + android:layout_height="100dip" + android:textSize="30sp" + android:text="@string/test_fail" /> +</LinearLayout> diff --git a/MediaTek/FmRadio/res/menu/fm_action_bar.xml b/MediaTek/FmRadio/res/menu/fm_action_bar.xml new file mode 100755 index 0000000..70aa2db --- /dev/null +++ b/MediaTek/FmRadio/res/menu/fm_action_bar.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + + <item android:id="@+id/fm_channel_list" + android:showAsAction ="always" + android:title="@string/favorite_manager" + style="@android:style/Widget.Holo.ActionButton.Overflow" + android:icon="@drawable/btn_fm_list_selector" + android:enabled="false"/> + <item android:id="@+id/fm_power" + android:showAsAction ="always" + android:title="@string/power" + style="@android:style/Widget.Holo.ActionButton.Overflow" + android:icon="@drawable/btn_fm_powerdown_selector" + android:enabled="false"/> + + <item android:id="@+id/fm_menu" + android:showAsAction="always" + android:title="@string/more" + style="@android:style/Widget.Holo.ActionButton.Overflow" + android:icon="@drawable/btn_fm_overflow_selector" + android:enabled="false"/> +</menu> diff --git a/MediaTek/FmRadio/res/menu/fm_menu.xml b/MediaTek/FmRadio/res/menu/fm_menu.xml new file mode 100755 index 0000000..12b6015 --- /dev/null +++ b/MediaTek/FmRadio/res/menu/fm_menu.xml @@ -0,0 +1,48 @@ +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/fm_search" + android:title="@string/optmenu_search" + android:enabled="false"/> + <item android:id="@+id/fm_sound_mode" + android:title="@string/optmenu_speaker" + android:enabled="false"/> + <item android:id="@+id/fm_record" + android:title="@string/optmenu_record" + android:enabled="false"/> +</menu> diff --git a/MediaTek/FmRadio/res/values-af/strings.xml b/MediaTek/FmRadio/res/values-af/strings.xml new file mode 100755 index 0000000..524b44a --- /dev/null +++ b/MediaTek/FmRadio/res/values-af/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM-radio</string> + <string name="dlg_progress_title">Soek</string> + <string name="btn_yes">Ja</string> + <string name="optmenu_speaker">Luidspreker</string> + <string name="edit_frequency_overwrite_text">Skryf oorheen</string> + <string name="toast_start_recording">Begin opneem...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Kanaallys is leeg.</string> + <string name="optmenu_rds_settings">RDS-instellings</string> + <string name="toast_channel_searched">Het beskikbare kanale uitgesoek:</string> + <string name="already_exists">bestaan reeds</string> + <string name="dlg_noantenna_title">Inprop-oorfoon</string> + <string name="add_to_favorite">Voeg by Gunsteling</string> + <string name="toast_sdcard_insufficient_space">Te min ruimte op SD-kaart!</string> + <string name="dlg_delete_confirm_title">Bevestig verwyder uit gunstelinge</string> + <string name="optmenu_record">Neem FM op</string> + <string name="optmenu_earphone">Oorfoon</string> + <string name="sound_mode">Klankmodus</string> + <string name="toast_already_favorite">Hierdie kanaal is reeds in die gunstelinglys.</string> + <string name="not_available">Tans nie beskikbaar nie</string> + <string name="toast_channel_deleted">Suksesvol uit gunstelinge verwyder.</string> + <string name="toast_channel_added">Suksesvol by gunstelinge gevoeg.</string> + <string name="dlg_rds_settings_channel_information">Kanaalinligting</string> + <string name="toast_favorite_full">Kan nie die kanaal by die gunstelinglys voeg nie, want dis vol.</string> + <string name="btn_save_recording">Stoor</string> + <string name="optmenu_search">Soek</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatiewe frekwensie</string> + <string name="dlg_progress_text">Deursoek kanale...</string> + <string name="optmenu_exit">Verlaat</string> + <string name="more">Meer</string> + <string name="btn_discard_recording">Gooi weg</string> + <string name="contmenu_item_edit">Redigeer</string> + <string name="toast_cannot_search">Kan nie beskikbare kanaal uitsoek nie.</string> + <string name="dlg_save_recording_storage_warning">Te min ruimte! Wil jy die huidige opname stoor?</string> + <string name="toast_in_call">Jy kan nie FM-radio begin terwyl jy in \'n oproep is nie.</string> + <string name="dlg_addedit_station_freq">Frekwensie:</string> + <string name="toast_recorder_internal_error">\'n Interne fout het in opnemer voorgekom!</string> + <string name="dlg_save_recording_title">Stoor opnamelêer</string> + <string name="btn_ok">Oukei</string> + <string name="power">Krag</string> + <string name="contmenu_item_delete">Verwyder uit gunstelinge</string> + <string name="toast_powerup_before_record_warning">Skakel eers FM aan!</string> + <string name="fm_recorder_name">FM-opnemer</string> + <string name="toast_recording_lost_warning">Jou opname sal verlore gaan, weens SD-kaart uitgehaal!</string> + <string name="dlg_delete_confirm_text">Is jy seker jy wil hierdie kanaal uit gunstelinge verwyder?</string> + <string name="default_station_name">Nuwe kanaal</string> + <string name="btn_cancel">Kanselleer</string> + <string name="contmenu_title">Werkinge</string> + <string name="btn_no">Nee</string> + <string name="favorite_manager">Kanaallys</string> + <string name="toast_invalid_frequency">Ongeldige frekwensie vir huidige ligging. Geldige frekwensieomvang: 87,5-108,0</string> + <string name="toast_sdcard_missing">Jou SD-kaart word vermis!</string> + <string name="dlg_addedit_station_name">Naam:</string> + <string name="dlg_addedit_title_edit">Redigeer kanaal</string> + <string name="toast_invalid_input">Vorige invoer is ongeldig; geldige waarde is 0 of 5.</string> + <string name="edit_recording_name_hint">Tik lêernaam hier</string> + <string name="dlg_noantenna_text">Jy kort \'n oorfoon as antenna. Prop een by jou foon in.</string> + <string name="toast_player_internal_error">\'n Interne fout het in speler voorgekom!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-am/strings.xml b/MediaTek/FmRadio/res/values-am/strings.xml new file mode 100755 index 0000000..40dd643 --- /dev/null +++ b/MediaTek/FmRadio/res/values-am/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name"> FM ሬዲዮ</string> + <string name="dlg_progress_title"> ፈልግ</string> + <string name="btn_yes"> አዎ</string> + <string name="optmenu_speaker"> ድምጽ ማጉያ</string> + <string name="edit_frequency_overwrite_text"> ደምስሰህ ጻፍ</string> + <string name="toast_start_recording"> መቅዳት ጀምር…</string> + <string name="fm_unit"> MHz</string> + <string name="empty_list"> የጣቢያዉ ዝርዝር ባዶ ነዉ፡፡</string> + <string name="optmenu_rds_settings"> RDS ቅንብሮች</string> + <string name="toast_channel_searched"> ያሉትን ጣበያዎች ፈልጎ ጨርሷል፡</string> + <string name="already_exists"> ከዚህ በፊት አለ</string> + <string name="dlg_noantenna_title"> የጆሮ ማዳመጫዉን ይሰኩ</string> + <string name="add_to_favorite"> ወደ ተወዳጆች ጨምር</string> + <string name="toast_sdcard_insufficient_space"> በቂ ያልሆነ የSD ካርድ ቦታ!</string> + <string name="dlg_delete_confirm_title"> ከተወዳጆች መወገዱን ያረጋግጡ</string> + <string name="optmenu_record"> FMን ቅዳ </string> + <string name="optmenu_earphone"> የጆሮ ማዳመጫ</string> + <string name="sound_mode"> የድምጽ ሁኔታ</string> + <string name="toast_already_favorite"> ጣቢያዉ ከዚህ በፊት በተወዳጆች ዝርዝር ዉስጥ አለ፡፡</string> + <string name="not_available"> በአሁኑ ወቅት የለም</string> + <string name="toast_channel_deleted"> በተሳካ ሁኔታ ከተወዳጆች ተወግዷል፡፡</string> + <string name="toast_channel_added"> በተሳካ ሁኔታ ወደተወዳጆች ተጨምሯል፡፡</string> + <string name="dlg_rds_settings_channel_information"> የጣቢያ መረጃ</string> + <string name="toast_favorite_full"> የተወዳጆች ጣቢያ ዝርዝር ስለሞላ ጣቢያዉን ወደ ተወዳጆች ዝርዝር ማስገባት አይቻልም፡፡</string> + <string name="btn_save_recording"> አስቀምጥ</string> + <string name="optmenu_search"> ፈልግ</string> + <string name="dlg_rds_settings_alternative_frequency"> አማራጭ ሞገድ</string> + <string name="dlg_progress_text"> ጣቢያዎችን ፈልግ</string> + <string name="optmenu_exit"> ዉጣ</string> + <string name="more"> የበለጡ</string> + <string name="btn_discard_recording"> አስወግድ</string> + <string name="contmenu_item_edit"> አርታእ</string> + <string name="toast_cannot_search"> ያሉትን ጣበያዎች መፈለግ አይቻልም፡፡</string> + <string name="dlg_save_recording_storage_warning"> በቂ ያልሆነ ማከማቻ! አሁን የተቀዳዉን ማስቀመጥ ይፈልጋሉ;</string> + <string name="toast_in_call"> በጥሪ ላይ እያሉ FMሬዲዮን ማስነሳት አይችሉም፡፡</string> + <string name="dlg_addedit_station_freq"> ሞገድ፡</string> + <string name="toast_recorder_internal_error"> በመቅጃዉ ላይ ዉስጣዊ ስህተት ተከስቷል!</string> + <string name="dlg_save_recording_title"> የፍይሉን </string> + <string name="btn_ok"> እሺ</string> + <string name="power"> ሃይል</string> + <string name="contmenu_item_delete"> ከተወዳጆች አስወግድ</string> + <string name="toast_powerup_before_record_warning"> እባክዎ በመጀመሪያ FMን ያስነሱ!</string> + <string name="fm_recorder_name"> የFM መቅጃ</string> + <string name="toast_recording_lost_warning"> SD በመወገዱ ምክንያት ቅጂዎ ይጠፋል!</string> + <string name="dlg_delete_confirm_text"> ይህንን ጣቢያ ከተወዳጆች ለማስወገድ መፈለግዎትን እርግጠኛ ነዎት?</string> + <string name="default_station_name"> አዲስ ጣቢያ</string> + <string name="btn_cancel"> ሰርዝ</string> + <string name="contmenu_title"> እንቅስቃሴዎች</string> + <string name="btn_no"> አይ</string> + <string name="favorite_manager"> የጣቢያ ዝርዝር</string> + <string name="toast_invalid_frequency"> ለአሁኑ ቦታ ትክክለኛ ያልሆነ ሞገድ ነዉ፡፡ ትክክለኛ የሆነ የሞገድ መጠን ፡87.5-108.0</string> + <string name="toast_sdcard_missing"> SD ካርድዎ የለም!</string> + <string name="dlg_addedit_station_name"> ስም፡</string> + <string name="dlg_addedit_title_edit"> ጣቢያን አርታእ</string> + <string name="toast_invalid_input"> የመጨረሻ ያስገቡት ግቤት ትክክል አይደለም፣ ትክክለኛዉ ከ 0 እስከ 5 መሆን አለበት፡፡</string> + <string name="edit_recording_name_hint"> የፋይሉን ስም እዚህ ጋር ይተይቡ</string> + <string name="dlg_noantenna_text"> የጆሮ ማዳመጫ እንደ አንቴና ያስፈልጎታል፡፡ እባክዎ የጆሮ ማዳመጫዉን ይሰኩ፡፡</string> + <string name="toast_player_internal_error"> በማጫወቻዉ ላይ ዉስጣዊ ስህተት ተከስቷል!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-ar/strings.xml b/MediaTek/FmRadio/res/values-ar/strings.xml new file mode 100755 index 0000000..d5a3c77 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ar/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">راديو FM</string> + <string name="favorite_manager">قائمة القنوات</string> + <string name="add_to_favorite">إضافة إلى المفضلات</string> + <string name="optmenu_search">"بحث"</string> + <string name="optmenu_exit">خروج</string> + <string name="contmenu_title">العمليات</string> + <string name="contmenu_item_edit">"تعديل"</string> + <string name="contmenu_item_delete">إزالة من المفضلات</string> + <string name="dlg_noantenna_text">يجب أن يكون لديك سماعة أذن لهوائي. رجاء توصيل سماعة الأذن.</string> + <string name="dlg_noantenna_title">توصيل سماعة الأذن</string> + <string name="btn_yes">"نعم"</string> + <string name="btn_no">"لا"</string> + <string name="btn_ok">"موافق"</string> + <string name="btn_cancel">"إلغاء"</string> + <string name="dlg_progress_title">مسح</string> + <string name="dlg_progress_text">مسح القنوات...</string> + <string name="dlg_addedit_station_name">الاسم:</string> + <string name="dlg_addedit_station_freq">التكرار:</string> + <string name="dlg_addedit_title_edit">تحرير القناة</string> + <string name="default_station_name">قناة جديدة</string> + <string name="dlg_delete_confirm_title">تأكيد مسح القناة</string> + <string name="dlg_delete_confirm_text">هل تريد بالتأكيد حذف هذه القناة؟</string> + <string name="toast_favorite_full">تتعذر إضافة القناة إلى قائمة المفضلة نظرًا لاكتمالها.</string> + <string name="toast_already_favorite">هذه القناة موجودة بالفعل في قائمة المفضلة.</string> + <string name="toast_channel_deleted">تمت الإزالة من المفضلات بنجاح</string> + <string name="toast_channel_added">تمت الإضافة إلى المفضلات بنجاح</string> + <string name="toast_channel_searched">القنوات المتوفرة التي تم مسحها:</string> + <string name="toast_cannot_search">تعذر البحث عن قناة متاحة.</string> + <string name="optmenu_rds_settings">إعدادات نظام بيانات الراديو</string> + <string name="dlg_rds_settings_channel_information">معلومات القناة</string> + <string name="dlg_rds_settings_alternative_frequency">التردد البديل</string> + <string name="more">المزيد من التطبيقات</string> + <string name="power">أس</string> + <string name="sound_mode">وضع الصوت</string> + <string name="edit_frequency_overwrite_text">"استبدال"</string> + <string name="fm_unit">ميجا هرتز</string> + <string name="no_antenna_info">قم بتوصيل سماعات الأذن لاستخدامها كهوائي الراديو.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">مسجل FM</string> + <string name="toast_recording_lost_warning">ستفقد التسجيلات نتيجة نزع بطاقة SD!</string> + <string name="toast_start_recording">بدء التسجيل…</string> + <string name="toast_sdcard_missing">بطاقة SD مفقودة!</string> + <string name="toast_sdcard_insufficient_space">مساحة غير كافية على بطاقة SD!</string> + <string name="toast_recorder_internal_error">حدث خطأ داخلي في المسجل!</string> + <string name="toast_player_internal_error">حدث خطأ داخلي في المشغل!</string> + <string name="toast_powerup_before_record_warning">يرجى تشغيل FM أولاً!</string> + <string name="optmenu_record">تسجيل FM</string> + <string name="btn_save_recording">حفظ</string> + <string name="btn_discard_recording">تجاهل</string> + <string name="edit_recording_name_hint">اكتب اسم الملف هنا</string> + <string name="dlg_save_recording_title">حفظ ملف التسجيل</string> + <string name="dlg_save_recording_storage_warning">مساحة التخزين غير كافية! هل تريد حفظ التسجيل الحالي؟</string> + <string name="already_exists">موجود بالفعل</string> + <string name="toast_invalid_frequency">تردد غير صالح للموقع الحالي. نطاق التردد الصالح: 87,5-108,0.</string> + <string name="toast_invalid_input">المُدخل الأخير غير صحيح، القيمة الصحيحة هي 0 أو 5.</string> + <string name="toast_in_call">لا يمكن تشغيل راديو FM أثناء إجراء مكالمة.</string> + <string name="empty_list">قائمة القنوات فارغة.</string> + <string name="optmenu_speaker">"السماعة"</string> + <string name="optmenu_earphone">سماعة رأس</string> + <string name="not_available">غير متاح حاليًا</string> + <string name="add_to_favorite1">إضافة إلى القنوات مسبقة الضبط</string> + <string name="contmenu_item_delete1">إزالة من القنوات مسبقة الضبط</string> + <string name="dlg_delete_confirm_title1">تأكيد الإزالة من القنوات مسبقة الضبط</string> + <string name="dlg_delete_confirm_text1">هل أنت متأكد من رغبتك في إزالة هذه القناة من القنوات مسبقة الضبط؟</string> + <string name="toast_favorite_full1">يتعذر إضافة القناة إلى قائمة القنوات مسبقة الضبط لأنها ممتلئة.</string> + <string name="toast_already_favorite1">هذه القناة موجودة بالفعل في قائمة القنوات مسبقة الضبط.</string> + <string name="toast_channel_deleted1">تمت الإزالة بنجاح من القنوات مسبقة الضبط.</string> + <string name="toast_channel_added1">تمت الإضافة بنجاح إلى القنوات مسبقة الضبط.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-bg/strings.xml b/MediaTek/FmRadio/res/values-bg/strings.xml new file mode 100755 index 0000000..394ee51 --- /dev/null +++ b/MediaTek/FmRadio/res/values-bg/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">УКВ радио</string> + <string name="favorite_manager">Списък канали</string> + <string name="add_to_favorite">Добави към предпочитани</string> + <string name="optmenu_search">Търсене</string> + <string name="optmenu_exit">Изход</string> + <string name="contmenu_title">Действия</string> + <string name="contmenu_item_edit">Редактиране</string> + <string name="contmenu_item_delete">Изтриване от предпочитани</string> + <string name="dlg_noantenna_text">Като антена трябва да има слушалки. Включете слушалките.</string> + <string name="dlg_noantenna_title">Включете слешалките</string> + <string name="btn_yes">"Да"</string> + <string name="btn_no">"Не"</string> + <string name="btn_ok">ОК</string> + <string name="btn_cancel">Отказ</string> + <string name="dlg_progress_title">Търсене</string> + <string name="dlg_progress_text">Търсене на канали…</string> + <string name="dlg_addedit_station_name">Име:</string> + <string name="dlg_addedit_station_freq">Честота:</string> + <string name="dlg_addedit_title_edit">Редактиране канал</string> + <string name="default_station_name">Нов канал</string> + <string name="dlg_delete_confirm_title">Потвърдете изтриване от предпочитани</string> + <string name="dlg_delete_confirm_text">Настоявате ли да изтрием този канал от предпочитаните?</string> + <string name="toast_favorite_full">Каналът не може да се добави в списък предпочитани - списъкът е пълен.</string> + <string name="toast_already_favorite">Каналът вече е в списък предпочитани.</string> + <string name="toast_channel_deleted">Успешно изтриване от предпочитани.</string> + <string name="toast_channel_added">Успешно добавяне към предпочитани.</string> + <string name="toast_channel_searched">Търсене на достъпни канали:</string> + <string name="toast_cannot_search">Търсенето на достъпен канал невъзможно.</string> + <string name="toast_invalid_frequency">Невалидна честота за това местоположение. Допустим честотен диапазон: 87,5 - 108,0</string> + <string name="toast_invalid_input">Последно невалидно въвеждане - разрешени стойности 0 или 5.</string> + <string name="optmenu_rds_settings">Настройки RDS</string> + <string name="dlg_rds_settings_channel_information">Информация за канали</string> + <string name="dlg_rds_settings_alternative_frequency">Резервна честота</string> + <string name="sound_mode">Режим саунд</string> + <string name="more">"Още"</string> + <string name="power">"степен"</string> + <string name="toast_in_call">Не можете да включите УКВ радио по време на обаждане.</string> + <string name="empty_list">Празен списък канали.</string> + <string name="edit_frequency_overwrite_text">Пренаписване</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Включете слушалките за използване като радио антена.</string> + <string name="fm_recorder_name">УКВ записващо у-во</string> + <string name="toast_recording_lost_warning">Записът ще изчезне при изваждане на SD картата!</string> + <string name="toast_start_recording">Начало запис…</string> + <string name="toast_sdcard_missing">Липсва SD карта!</string> + <string name="toast_sdcard_insufficient_space">Недостатъчно място на SD картата!</string> + <string name="toast_recorder_internal_error">Вътрешна грешка в записващото у-во!</string> + <string name="toast_player_internal_error">Вътрешна грешка в плеъра!</string> + <string name="toast_powerup_before_record_warning">Първо включете УКВ!</string> + <string name="optmenu_record">Запис на УКВ</string> + <string name="btn_save_recording">"Запазване"</string> + <string name="btn_discard_recording">Отхвърляне</string> + <string name="edit_recording_name_hint">Въведете име на файл тук</string> + <string name="dlg_save_recording_title">Запаметяване на записващия файл</string> + <string name="dlg_save_recording_storage_warning">Недостатъчно памет! Искате ли да запаметите този запис?</string> + <string name="already_exists">вече съществува</string> + <string name="optmenu_speaker">Високоговорител</string> + <string name="optmenu_earphone">Слушалки</string> + <string name="not_available">Недостъпен в момента</string> + <string name="add_to_favorite1">Добави към пре-настроени канали</string> + <string name="contmenu_item_delete1">Изтриване от пре-настроени канали</string> + <string name="dlg_delete_confirm_title1">Потвърдете изтриване от пре-настроени канали</string> + <string name="dlg_delete_confirm_text1">Настоявате ли да изтрием този канал от пре-настроените?</string> + <string name="toast_favorite_full1">Каналът не може да се добави в списък пре-настроени - списъкът е пълен.</string> + <string name="toast_already_favorite1">Каналът вече е в списък пре-настроени.</string> + <string name="toast_channel_deleted1">Успешно изтриване от пре-настроени.</string> + <string name="toast_channel_added1">Успешно добавяне към пре-настроени.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-bn/strings.xml b/MediaTek/FmRadio/res/values-bn/strings.xml new file mode 100755 index 0000000..7c24348 --- /dev/null +++ b/MediaTek/FmRadio/res/values-bn/strings.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">এফএম রেডিও</string> + <string name="favorite_manager">চ্যানেলের তালিকা</string> + <string name="add_to_favorite">প্রিয়-তে যোগ করুন</string> + <string name="optmenu_search">অনুসন্ধান করুন</string> + <string name="optmenu_exit">প্রস্থান</string> + <string name="contmenu_title">অপারেশন</string> + <string name="contmenu_item_edit">সম্পাদনা করুন</string> + <string name="contmenu_item_delete">প্রিয় তালিকা থেকে সরিয়ে ফেলুন</string> + <string name="dlg_noantenna_text">এন্টেনা হিসেবে আপনার ইয়ারফোন প্রয়োজন। আপনার ইয়ারফোন লাগান।</string> + <string name="dlg_noantenna_title">ইয়ারফোন লাগান</string> + <string name="btn_yes">হ্যাঁ</string> + <string name="btn_no">না </string> + <string name="btn_ok">ঠিক আছে </string> + <string name="btn_cancel">বাতিল করুন</string> + <string name="dlg_progress_title">স্ক্যান করুন</string> + <string name="dlg_progress_text">চ্যানেল স্ক্যান করুন...</string> + <string name="dlg_addedit_station_name">নাম:</string> + <string name="dlg_addedit_station_freq">ফ্রিকোয়েন্সি:</string> + <string name="dlg_addedit_title_edit">চ্যানেল সম্পাদনা</string> + <string name="default_station_name">নতুন চ্যানেল</string> + <string name="dlg_delete_confirm_title">চ্যানেলটি মুছে ফেলা নিশ্চিত করুন</string> + <string name="dlg_delete_confirm_text">আপনি কি নিশ্চিতভাবেই চ্যানেলটি মুছে ফেলতে চান?</string> + <string name="toast_favorite_full">প্রিয় তালিকায় চ্যানেলটি যুক্ত করা যাচ্ছে না কারণ তালিকা পূর্ণ। </string> + <string name="toast_already_favorite">চ্যানেলটি প্রিয় তালিকায় আগে থেকেই বিদ্যমান।</string> + <string name="toast_channel_deleted">প্রিয় তালিকা থেকে সফলভাবে সরিয়ে ফেলা হয়েছে</string> + <string name="toast_channel_added">প্রিয় তালিকায় সফলভাবে যোগ করা হয়েছে</string> + <string name="toast_channel_searched">বিদ্যমানগুলো চ্যানেল অনুসন্ধান করা হয়েছে:</string> + <string name="toast_cannot_search">বিদ্যমান চ্যানেল অনুসন্ধান করে বের করতে পারছে না ।</string> + <string name="optmenu_rds_settings">আরডিএস সেটিং</string> + <string name="dlg_rds_settings_channel_information">চ্যানেলের তথ্য</string> + <string name="dlg_rds_settings_alternative_frequency">বিকল্প ফ্রিকোয়েন্সি</string> + <string name="more">আরো অ্যাপ্লিকেশন</string> + <string name="power">পাওয়ার</string> + <string name="sound_mode">সাউন্ড মোড</string> + <string name="edit_frequency_overwrite_text">ওভাররাইট করুন</string> + <string name="fm_unit">মে.হার্টস</string> + <string name="no_antenna_info">রেডিও এন্টেনা হিসেবে ব্যবহার করতে আপনার ইয়ারফোন লাগান।</string> + + <!-- For FM recording --> + <string name="fm_recorder_name">এফএম রেকর্ডার</string> + <string name="toast_recording_lost_warning">এসডি সরিয়ে ফেলার কারণে আপনার রেকর্ড করা জিনিস হারিয়ে যাবে!</string> + <string name="toast_start_recording">রেকর্ড করা শুরু…</string> + <string name="toast_sdcard_missing">আপনার এসডি কার্ড পাওয়া যাচ্ছে না!</string> + <string name="toast_sdcard_insufficient_space">এসডি কার্ডে জায়গা অপর্যাপ্ত!</string> + <string name="toast_recorder_internal_error">রেকর্ডারে একটি অভ্যন্তরীণ ত্রুটি ঘটেছে!</string> + <string name="toast_player_internal_error">প্লেয়ারে একটি অভ্যন্তরীণ ত্রুটি ঘটেছে!</string> + <string name="toast_powerup_before_record_warning">প্রথমে এফএম চালু করুন!</string> + <string name="optmenu_record">এফএম রেকর্ড করুন</string> + <string name="btn_save_recording">সংরক্ষণ করুন</string> + <string name="btn_discard_recording">বাতিল করুন</string> + <string name="edit_recording_name_hint">এখানে ফাইলের নাম লিখুন</string> + <string name="dlg_save_recording_title">রেকর্ড করা ফাইল সংরক্ষণ করুন</string> + <string name="dlg_save_recording_storage_warning">সংরক্ষণাগার অপর্যাপ্ত! আপনি কি বর্তমানে রেকর্ড করা জিনিস সংরক্ষণ করতে চান?</string> + <string name="already_exists">ইতিমধ্যেই বিদ্যমান</string> + <string name="toast_invalid_frequency">বর্তমান অবস্থানের জন্য অকার্যকর ফ্রিকোয়েন্সি। কার্যকর ফ্রিকোয়েন্সি স্কোপ: 87.5-108.0।</string> + <string name="toast_invalid_input">সর্বশেষ অকার্যকর ইনপুট, কার্যকর মূল্য হল ০ বা ৫।</string> + <string name="toast_in_call">কলে থাকা অবস্থায় আপনি এফএম রেডিও চালু করতে পারবেন না।</string> + <string name="empty_list">চ্যানেল তালিকা খালি।</string> + <string name="optmenu_speaker">স্পিকার</string> + <string name="optmenu_earphone">হেডসেট</string> + <string name="not_available">বর্তমানে পাওয়া যাচ্ছে না</string> + + <string name="add_to_favorite1">চ্যানেল প্রিসেট করতে যোগ করুন</string> + <string name="contmenu_item_delete1">প্রিসেট চ্যানেল থেকে সরিয়ে ফেলুন</string> + <string name="dlg_delete_confirm_title1">প্রিসেট চ্যানেল থেকে সরানো নিশ্চিত করুন</string> + <string name="dlg_delete_confirm_text1">আপনি কি নিশ্চিত যে আপনি এই চ্যানেল প্রিসেট চ্যানেল থেকে সরিয়ে ফেলতে চান?</string> + <string name="toast_favorite_full1">প্রিসেট চ্যানেলের তালিকায় চ্যানেলটি যোগ করা যাচ্ছে না কারণ এটি পূর্ণ।</string> + <string name="toast_already_favorite1">এই চ্যানেল ইতিমধ্যে প্রিসেট চ্যানেল তালিকায় আছে।</string> + <string name="toast_channel_deleted1">প্রিসেট চ্যানেল থেকে সফলভাবে সরিয়ে ফেলা হয়েছে।</string> + <string name="toast_channel_added1">প্রিসেট চ্যানেলে সফলভাবে যোগ করা হয়েছে।</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-ca/strings.xml b/MediaTek/FmRadio/res/values-ca/strings.xml new file mode 100755 index 0000000..3ddfd09 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ca/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Ràdio FM</string> + <string name="dlg_progress_title">Cerca</string> + <string name="btn_yes">Sí</string> + <string name="optmenu_speaker">Altaveu</string> + <string name="edit_frequency_overwrite_text">Sobreescriu</string> + <string name="toast_start_recording">Inicia l’enregistrament…</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">La llista de canals és buida.</string> + <string name="optmenu_rds_settings">Configuració d’RDS</string> + <string name="toast_channel_searched">Canals disponibles que s’han cercat:</string> + <string name="already_exists">ja existeix</string> + <string name="dlg_noantenna_title">Connecta l’auricular</string> + <string name="add_to_favorite">Afegeix als favorits</string> + <string name="toast_sdcard_insufficient_space">Espai insuficient a la targeta SD!</string> + <string name="dlg_delete_confirm_title">Confirma la supressió dels favorits</string> + <string name="optmenu_record">Enregistra FM</string> + <string name="optmenu_earphone">Auricular</string> + <string name="sound_mode">Mode de so</string> + <string name="toast_already_favorite">Aquest canal ja és a la llista de favorits.</string> + <string name="not_available">Actualment no està disponible</string> + <string name="toast_channel_deleted">S’ha eliminat correctament dels favorits.</string> + <string name="toast_channel_added">S’ha afegit correctament als favorits.</string> + <string name="dlg_rds_settings_channel_information">Informació del canal</string> + <string name="toast_favorite_full">El canal no pot afegir-se a la llista de favorits perquè és plena.</string> + <string name="btn_save_recording">Desa-ho</string> + <string name="optmenu_search">Cerca</string> + <string name="dlg_rds_settings_alternative_frequency">Freqüència alternativa</string> + <string name="dlg_progress_text">Cerca canals...</string> + <string name="optmenu_exit">Surt</string> + <string name="more">Més</string> + <string name="btn_discard_recording">Descarta</string> + <string name="contmenu_item_edit">Edita</string> + <string name="toast_cannot_search">No es poden cercar canals disponibles.</string> + <string name="dlg_save_recording_storage_warning">Emmagatzematge insuficient! Voleu desar l’enregistrament actual?</string> + <string name="toast_in_call">La ràdio FM no pot iniciar-se amb una trucada en curs.</string> + <string name="dlg_addedit_station_freq">Freqüència:</string> + <string name="toast_recorder_internal_error">S’ha produït un error intern a l’enregistrador!</string> + <string name="dlg_save_recording_title">Desa fitxer d’enregistrament</string> + <string name="btn_ok">Accepta</string> + <string name="power">Alimentació</string> + <string name="contmenu_item_delete">Suprimeix dels favorits</string> + <string name="toast_powerup_before_record_warning">Engega primer l’FM!</string> + <string name="fm_recorder_name">Enregistrador d’FM</string> + <string name="toast_recording_lost_warning">L’extracció de l’SD provocarà la pèrdua de l’enregistrament!</string> + <string name="dlg_delete_confirm_text">Esteu segur que voleu eliminar aquest canal dels favorits?</string> + <string name="default_station_name">Canal nou</string> + <string name="btn_cancel">Cancel·la</string> + <string name="contmenu_title">Operacions</string> + <string name="btn_no">No</string> + <string name="favorite_manager">Llista de canals</string> + <string name="toast_invalid_frequency">Freqüència no vàlida per a la ubicació actual. Interval de freqüències vàlides: 87.5-108.0</string> + <string name="toast_sdcard_missing">No hi ha cap targeta SD!</string> + <string name="dlg_addedit_station_name">Nom:</string> + <string name="dlg_addedit_title_edit">Edita el canal</string> + <string name="toast_invalid_input">La darrera entrada no és vàlida, els valors vàlids són 0 o 5.</string> + <string name="edit_recording_name_hint">Escriviu aquí el nom de fitxer</string> + <string name="dlg_noantenna_text">Necessiteu un auricular com a antena. Endolleu l’auricular.</string> + <string name="toast_player_internal_error">S’ha produït un error intern al reproductor!</string> + <string name="no_antenna_info">Connecta els auriculars per utilitzar-los com a antena d’àudio.</string> + <string name="add_to_favorite1">Afegeix als canals predeterminats</string> + <string name="contmenu_item_delete1">Suprimeix dels canals predeterminats</string> + <string name="dlg_delete_confirm_title1">Confirma la supressió dels canals predeterminats</string> + <string name="dlg_delete_confirm_text1">Estàs segur que vols suprimir aquest canal dels canals predeterminats?</string> + <string name="toast_favorite_full1">No es pot afegir el canal a la llista de canals predeterminats perquè està plena.</string> + <string name="toast_already_favorite1">Aquest canal ja es troba a la llista de canals predeterminats.</string> + <string name="toast_channel_deleted1">S’ha suprimit correctament dels canals predeterminats.</string> + <string name="toast_channel_added1">S’ha afegit correctament als canals predeterminats</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-cs/strings.xml b/MediaTek/FmRadio/res/values-cs/strings.xml new file mode 100755 index 0000000..9ac1ac0 --- /dev/null +++ b/MediaTek/FmRadio/res/values-cs/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM rádio</string> + <string name="favorite_manager">Seznam kanálů</string> + <string name="add_to_favorite">Přidat k oblíbeným položkám</string> + <string name="optmenu_search">Hledat</string> + <string name="optmenu_exit">Konec</string> + <string name="contmenu_title">Operace</string> + <string name="contmenu_item_edit">Úpravy</string> + <string name="contmenu_item_delete">Odebrat z oblíbených položek</string> + <string name="dlg_noantenna_text">Jsou zapotřebí sluchátka jako anténa. Připojte sluchátka.</string> + <string name="dlg_noantenna_title">Připojit sluchátka</string> + <string name="btn_yes">Ano</string> + <string name="btn_no">Ne</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Storno</string> + <string name="dlg_progress_title">Vyhledat</string> + <string name="dlg_progress_text">Prohledat kanály...</string> + <string name="dlg_addedit_station_name">Název:</string> + <string name="dlg_addedit_station_freq">Frekvence:</string> + <string name="dlg_addedit_title_edit">Upravit kanál</string> + <string name="default_station_name">Nový kanál</string> + <string name="dlg_delete_confirm_title">Potvrdit odebrání z oblíbených</string> + <string name="dlg_delete_confirm_text">Opravdu chcete odebrat tento kanál z oblíbených?</string> + <string name="toast_favorite_full">Nelze přidat kanál do seznamu oblíbených, protože je plný.</string> + <string name="toast_already_favorite">Tento kanál je již v seznamu oblíbených.</string> + <string name="toast_channel_deleted">Úspěšně odebráno z oblíbených položek.</string> + <string name="toast_channel_added">Úspěšně přidáno k oblíbeným položkám.</string> + <string name="toast_channel_searched">Vyhledané dostupné kanály:</string> + <string name="toast_cannot_search">Nelze vyhledat dostupný kanál.</string> + <string name="toast_invalid_frequency">Neplatná frekvence pro aktuální umístění. Platný rozsah frekvence: 87,5-108,0.</string> + <string name="optmenu_rds_settings">Nastavení RDS</string> + <string name="dlg_rds_settings_channel_information">Informace o kanálu</string> + <string name="dlg_rds_settings_alternative_frequency">Náhradní frekvence</string> + <string name="sound_mode">Režim zvuku</string> + <string name="more">Další aplikace</string> + <string name="power">síla</string> + <string name="edit_frequency_overwrite_text">"Přepsat"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Připojte sluchátka jako rozhlasovou anténu.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM rekordér</string> + <string name="toast_recording_lost_warning">Váš záznam bude ztracen z důvodu vyjmutí SD!</string> + <string name="toast_start_recording">Spustit záznam…</string> + <string name="toast_sdcard_missing">Karta SD chybí!</string> + <string name="toast_sdcard_insufficient_space">Nedostatek prostoru na kartě SD!</string> + <string name="toast_recorder_internal_error">Došlo k vnitřní chybě rekordéru!</string> + <string name="toast_player_internal_error">Došlo k vnitřní chybě přehrávače!</string> + <string name="toast_powerup_before_record_warning">Nejdříve zapněte napájení FM!</string> + <string name="optmenu_record">Záznam FM</string> + <string name="btn_save_recording">Uložit</string> + <string name="btn_discard_recording">Zahodit</string> + <string name="edit_recording_name_hint">Zde zadejte název souboru</string> + <string name="dlg_save_recording_title">Uložit soubor se záznamem</string> + <string name="dlg_save_recording_storage_warning">Nedostatek úložného prostoru. Chcete uložit aktuální záznam?</string> + <string name="already_exists">již existuje</string> + <string name="toast_invalid_input">Poslední neplatné zadání, platná hodnota je 0 nebo 5.</string> + <string name="toast_in_call">Nelze spustit FM rádio během volání.</string> + <string name="empty_list">Seznam kanálů je prázdný.</string> + <string name="optmenu_speaker">"Reproduktor"</string> + <string name="optmenu_earphone">Sluchátka s mikrofonem</string> + <string name="not_available">Aktuálně není k dispozici</string> + <string name="add_to_favorite1">Přidat k předvoleným kanálům</string> + <string name="contmenu_item_delete1">Odebrat z předvolených kanálů</string> + <string name="dlg_delete_confirm_title1">Potvrdit odebrání z předvolených kanálů</string> + <string name="dlg_delete_confirm_text1">Opravdu chcete odebrat tento kanál z předvolených kanálů?</string> + <string name="toast_favorite_full1">Nelze přidat kanál do seznamu předvolených kanálů, protože je plný.</string> + <string name="toast_already_favorite1">Tento kanál je již v seznamu předvolených kanálů.</string> + <string name="toast_channel_deleted1">Úspěšně odebráno z předvolených kanálů.</string> + <string name="toast_channel_added1">Úspěšně přidáno k předvoleným kanálům.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-da/strings.xml b/MediaTek/FmRadio/res/values-da/strings.xml new file mode 100755 index 0000000..06e5a8b --- /dev/null +++ b/MediaTek/FmRadio/res/values-da/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-radio</string> + <string name="favorite_manager">Kanalliste</string> + <string name="add_to_favorite">Tilføj til favoritter</string> + <string name="optmenu_search">Søg</string> + <string name="optmenu_exit">Forlad</string> + <string name="contmenu_title">Operationer</string> + <string name="contmenu_item_edit">Rediger</string> + <string name="contmenu_item_delete">Fjern fra Favoritter</string> + <string name="dlg_noantenna_text">Du skal bruge en øretelefon som antenne. Tilslut dine øretelefoner.</string> + <string name="dlg_noantenna_title">Tilslut dine øretelefoner</string> + <string name="btn_yes">"Ja"</string> + <string name="btn_no">"Nej"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Annuller</string> + <string name="dlg_progress_title">Søg</string> + <string name="dlg_progress_text">Søg efter kanaler...</string> + <string name="dlg_addedit_station_name">Navn:</string> + <string name="dlg_addedit_station_freq">Frekvens:</string> + <string name="dlg_addedit_title_edit">Rediger kanal</string> + <string name="default_station_name">Ny kanal</string> + <string name="dlg_delete_confirm_title">Bekræft at fjerne fra favoritter</string> + <string name="dlg_delete_confirm_text">Er du sikker på, at du vil fjerne denne kanal fra favoritter?</string> + <string name="toast_favorite_full">Kan ikke tilføje kanalen til listen med favoritter, da listen er fyldt.</string> + <string name="toast_already_favorite">Denne kanal er allerede på listen med favoritter.</string> + <string name="toast_channel_deleted">Fjernet fra favoritter.</string> + <string name="toast_channel_added">Tilføjet til favoritter.</string> + <string name="toast_channel_searched">Søgt efter tilgængelige kanaler:</string> + <string name="toast_cannot_search">Kan ikke søge efter tilgængelig kanal.</string> + <string name="toast_invalid_frequency">Ugyldigt frekvens for den aktuelle placering. Gyldigt frekvensinterval: 87,5-108,0</string> + <string name="toast_invalid_input">Den sidste ugyldige indtastning. Gyldig værdi er 0 eller 5.</string> + <string name="optmenu_rds_settings">RDS-indstillinger</string> + <string name="dlg_rds_settings_channel_information">Kanaloplysninger</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string> + <string name="sound_mode">Lydfunktion</string> + <string name="more">"Mere"</string> + <string name="power">"tænd/sluk"</string> + <string name="toast_in_call">Du kan ikke starte FM-radio, når du er i gang med et opkald.</string> + <string name="empty_list">Kanallisten er tom.</string> + <string name="edit_frequency_overwrite_text">Overskriv</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Tilslut dine øretelefoner for at bruge dem som radioantenne.</string> + <string name="fm_recorder_name">FM-optager</string> + <string name="toast_recording_lost_warning">Din optagelse mistes, hvis du fjerner SD-kortet!</string> + <string name="toast_start_recording">Start optagelse...</string> + <string name="toast_sdcard_missing">Dit SD-kort mangler!</string> + <string name="toast_sdcard_insufficient_space">Utilstrækkelig plads på SD-kort!</string> + <string name="toast_recorder_internal_error">Der opstod en intern fejl i optageren!</string> + <string name="toast_player_internal_error">Der opstod en intern fejl i afspilleren!</string> + <string name="toast_powerup_before_record_warning">Tænd først for FM!</string> + <string name="optmenu_record">Optag FM</string> + <string name="btn_save_recording">"Gem"</string> + <string name="btn_discard_recording">Kassér</string> + <string name="edit_recording_name_hint">Indtast filnavn her</string> + <string name="dlg_save_recording_title">Gem optaget fil</string> + <string name="dlg_save_recording_storage_warning">Utilstrækkelig lagerplads! Vil du gemme den aktuelle optagelse?</string> + <string name="already_exists">findes allerede</string> + <string name="optmenu_speaker">Højttaler</string> + <string name="optmenu_earphone">Øretelefon</string> + <string name="not_available">Ikke tilgængelig for øjeblikket</string> + <string name="add_to_favorite1">Tilføj til forudindstillede kanaler</string> + <string name="contmenu_item_delete1">Fjern fra forudindstillede kanaler</string> + <string name="dlg_delete_confirm_title1">Bekræft at fjerne fra forudindstillede kanaler</string> + <string name="dlg_delete_confirm_text1">Er du sikker på, at du vil fjerne denne kanal fra forudindstillede kanaler?</string> + <string name="toast_favorite_full1">Kan ikke tilføje kanalen til listen med forudindstillede kanaler, da listen er fyldt.</string> + <string name="toast_already_favorite1">Denne kanal er allerede på listen med forudindstillede kanaler.</string> + <string name="toast_channel_deleted1">Fjern fra forudindstillede kanaler.</string> + <string name="toast_channel_added1">Tilføjet til forudindstillede kanaler.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-de-rAT/strings.xml b/MediaTek/FmRadio/res/values-de-rAT/strings.xml new file mode 100755 index 0000000..e564f4d --- /dev/null +++ b/MediaTek/FmRadio/res/values-de-rAT/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-Radio</string> + <string name="favorite_manager">Kanalliste</string> + <string name="add_to_favorite">Zum Favoriten. hinzufügen</string> + <string name="optmenu_search">Suchen</string> + <string name="optmenu_exit">Beenden</string> + <string name="contmenu_title">Aktionen</string> + <string name="contmenu_item_edit">Editieren</string> + <string name="contmenu_item_delete">Aus Favoriten löschen</string> + <string name="dlg_noantenna_text">Sie benötigen Kopfhörer als Antenne. Stöpseln Sie Ihren Kopfhörer ein.</string> + <string name="dlg_noantenna_title">Kopfhörer einstecken</string> + <string name="btn_yes">Ja</string> + <string name="btn_no">Nein</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Abbrechen</string> + <string name="dlg_progress_title">Suchen</string> + <string name="dlg_progress_text">Kanäle suchen...</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_station_freq">Frequenz:</string> + <string name="dlg_addedit_title_edit">Kanal editieren</string> + <string name="default_station_name">Neuer Kanal</string> + <string name="dlg_delete_confirm_title">Aus Favoriten löschen bestätigen</string> + <string name="dlg_delete_confirm_text">Wollen Sie diesen Kanal wirklich aus den Favoriten löschen?</string> + <string name="toast_favorite_full">Kann Kanal nicht zur Favoritenliste hinzufügen, da diese voll ist.</string> + <string name="toast_already_favorite">Der Kanal existiert bereits in der Favoritenliste.</string> + <string name="toast_channel_deleted">Erfolgreich aus den Favoriten gelöscht.</string> + <string name="toast_channel_added">Erfolgreich den Favoriten hinzugefügt.</string> + <string name="toast_channel_searched">Suche aus verfügbaren Kanälen:</string> + <string name="toast_cannot_search">Suche aus verfügbaren Kanälen nicht möglich.</string> + <string name="toast_invalid_frequency">Ungültige Frequenz für momentanen Standort Gültiger Frequenzbereich: 87,5-108,0</string> + <string name="toast_invalid_input">Letzte ungültige Eingabe, gültige Werte sind 0 oder 5.</string> + <string name="optmenu_rds_settings">RDS-Einstellungen</string> + <string name="dlg_rds_settings_channel_information">Kanal-Information</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativfrequenz</string> + <string name="sound_mode">Sound-Modus</string> + <string name="more">Mehr</string> + <string name="power">Leistung</string> + <string name="toast_in_call">Sie können, wenn Sie telefonieren, das FM-Radio nicht starten.</string> + <string name="empty_list">Kanalliste ist leer.</string> + <string name="edit_frequency_overwrite_text">Überschreiben</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Stöpseln Sie den Ohrhörer ein, um ihn als Antenne zu verwenden.</string> + <string name="fm_recorder_name">FM-Recorder</string> + <string name="toast_recording_lost_warning">Da die SD-Karte entfernt wurde, geht die Aufnahme verloren.</string> + <string name="toast_start_recording">Aufnahme wird gestartet...</string> + <string name="toast_sdcard_missing">Ihre SD-Karte fehlt!</string> + <string name="toast_sdcard_insufficient_space">Platz auf SD-Karte reicht nicht aus!</string> + <string name="toast_recorder_internal_error">Interner Aufnahmefehler!</string> + <string name="toast_player_internal_error">Interner Wiedergabefehler!</string> + <string name="toast_powerup_before_record_warning">FM erst einschalten!</string> + <string name="optmenu_record">FM aufnehmen</string> + <string name="btn_save_recording">Speichern</string> + <string name="btn_discard_recording">Verwerfen</string> + <string name="edit_recording_name_hint">Hier Dateinamen eingeben</string> + <string name="dlg_save_recording_title">Aufnahmedatei speichern</string> + <string name="dlg_save_recording_storage_warning">Unzureichender Speicherplatz! Do you want to save current recording?</string> + <string name="already_exists">Existiert bereits</string> + <string name="optmenu_speaker">Lautsprecher</string> + <string name="optmenu_earphone">Kopfhörer</string> + <string name="not_available">Momentan nicht verfügbar</string> + <string name="add_to_favorite1">Zu gespeicherten Kanälen hinzufügen</string> + <string name="contmenu_item_delete1">Aus gespeicherten Kanälen löschen</string> + <string name="dlg_delete_confirm_title1">Aus gespeicherten Kanälen löschen betätigen</string> + <string name="dlg_delete_confirm_text1">Wollen Sie diesen Kanal wirklich aus den gespeicherten Kanälen löschen?</string> + <string name="toast_favorite_full1">Kann Kanal nicht zur Liste der gespeicherten Kanäle hinzufügen, da diese voll ist.</string> + <string name="toast_already_favorite1">Der Kanal existiert bereits in der Liste der gespeicherten Kanäle.</string> + <string name="toast_channel_deleted1">Erfolgreich aus den gespeicherten Kanälen gelöscht.</string> + <string name="toast_channel_added1">Erfolgreich zu den gespeicherten Kanälen hinzugefügt.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-de/strings.xml b/MediaTek/FmRadio/res/values-de/strings.xml new file mode 100755 index 0000000..a317db7 --- /dev/null +++ b/MediaTek/FmRadio/res/values-de/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-Übertragung</string> + <string name="favorite_manager">Senderliste</string> + <string name="add_to_favorite">Zu Favoriten hinzufügen</string> + <string name="optmenu_search">Suche</string> + <string name="optmenu_exit">Ausgang</string> + <string name="contmenu_title">Vorgänge</string> + <string name="contmenu_item_edit">Bearbeiten</string> + <string name="contmenu_item_delete">Aus Favoriten entfernen</string> + <string name="dlg_noantenna_text">Sie benötigen einen Kopfhörer als Antenne. Bitte schließen Sie Ihren Kopfhörer an.</string> + <string name="dlg_noantenna_title">Kopfhörer anschließen</string> + <string name="btn_yes">Ja</string> + <string name="btn_no">Nein</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Abbrechen</string> + <string name="dlg_progress_title">Suchen</string> + <string name="dlg_progress_text">Kanalsuche…</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_station_freq">Häufigkeit:</string> + <string name="dlg_addedit_title_edit">Kanal bearbeiten</string> + <string name="default_station_name">Neuer Kanal</string> + <string name="dlg_delete_confirm_title">Löschung des Senders bestätigen</string> + <string name="dlg_delete_confirm_text">Möchten Sie diesen Sender wirklich löschen?</string> + <string name="toast_favorite_full">Der Sender kann nicht zur Favoritenliste hinzugefügt werden, da die Liste voll ist.</string> + <string name="toast_already_favorite">Dieser Sender befindet sich bereits in der Favoritenliste.</string> + <string name="toast_channel_deleted">Erfolgreich aus Favoriten entfernt.</string> + <string name="toast_channel_added">Erfolgreich zu Favoriten hinzugefügt.</string> + <string name="toast_channel_searched">Entdeckte verfügbare Kanäle:</string> + <string name="toast_cannot_search">Suche nach verfügbarem Kanal nicht möglich.</string> + <string name="optmenu_rds_settings">RDS-Einstellungen</string> + <string name="dlg_rds_settings_channel_information">Kanalinformationen</string> + <string name="dlg_rds_settings_alternative_frequency">Alternative Frequenz</string> + <string name="more">Mehr Apps</string> + <string name="power">Potenz</string> + <string name="sound_mode">Klangmodus</string> + <string name="edit_frequency_overwrite_text">"Überschreiben"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Kopfhörer zur Nutzung als Radioantenne anschließen.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">UKW-Rekorder</string> + <string name="toast_recording_lost_warning">Ihre Aufzeichnung geht beim Entfernen der SD-Karte verloren!</string> + <string name="toast_start_recording">Aufzeichnung starten…</string> + <string name="toast_sdcard_missing">Ihre SD-Karte fehlt!</string> + <string name="toast_sdcard_insufficient_space">Nicht genügend Platz auf der SD-Karte!</string> + <string name="toast_recorder_internal_error">Im Recorder ist ein interner Fehler aufgetreten!</string> + <string name="toast_player_internal_error">Im Player ist ein interner Fehler aufgetreten!</string> + <string name="toast_powerup_before_record_warning">Bitte zuerst UKW einschalten!</string> + <string name="optmenu_record">UKW aufnehmen</string> + <string name="btn_save_recording">Speichern</string> + <string name="btn_discard_recording">Verwerfen</string> + <string name="edit_recording_name_hint">Hier Dateinamen eingeben</string> + <string name="dlg_save_recording_title">Aufzeichnungsdatei speichern</string> + <string name="dlg_save_recording_storage_warning">Nicht genügend Speicher! Möchten Sie die aktuelle Aufzeichnung speichern?</string> + <string name="already_exists">Existiert bereits</string> + <string name="toast_invalid_frequency">Ungültige Frequenz für aktuellen Standort. Gültiger Frequenzbereich: 87,5-108,0.</string> + <string name="toast_invalid_input">Die letzte Eingabe war ungültig, gültiger Wert: 0 oder 5.</string> + <string name="toast_in_call">Sie können das UKW-Radio während eines Telefonats nicht starten.</string> + <string name="empty_list">Kanalliste ist leer.</string> + <string name="optmenu_speaker">"Lautsprecher"</string> + <string name="optmenu_earphone">Headset</string> + <string name="not_available">Derzeit nicht verfügbar</string> + <string name="add_to_favorite1">Zu voreingestellten Kanälen hinzufügen</string> + <string name="contmenu_item_delete1">Aus voreingestellten Kanälen entfernen</string> + <string name="dlg_delete_confirm_title1">Entfernung aus voreingestellten Kanälen bestätigen</string> + <string name="dlg_delete_confirm_text1">Möchten Sie diesen Kanal wirklich aus den voreingestellten Kanälen entfernen?</string> + <string name="toast_favorite_full1">Der Kanal kann nicht zur Liste voreingestellter Kanäle hinzugefügt werden, da diese voll ist.</string> + <string name="toast_already_favorite1">Dieser Kanal ist bereits in der Liste voreingestellter Kanäle.</string> + <string name="toast_channel_deleted1">Erfolgreich aus voreingestellten Kanälen entfernt.</string> + <string name="toast_channel_added1">Erfolgreich zu voreingestellten Kanälen hinzufügt.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-el/strings.xml b/MediaTek/FmRadio/res/values-el/strings.xml new file mode 100755 index 0000000..1fdf094 --- /dev/null +++ b/MediaTek/FmRadio/res/values-el/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Ραδιόφωνο FM</string> + <string name="favorite_manager">Λίστα καναλιών</string> + <string name="add_to_favorite">Προσθήκη στα αγαπημένα</string> + <string name="optmenu_search">Αναζήτηση</string> + <string name="optmenu_exit">Έξοδος</string> + <string name="contmenu_title">Λειτουργίες</string> + <string name="contmenu_item_edit">Επεξεργασία</string> + <string name="contmenu_item_delete">Κατάργηση από τα αγαπημένα</string> + <string name="dlg_noantenna_text">Χρειάζεται ένα ακουστικό για κεραία. Συνδέστε το ακουστικό σας.</string> + <string name="dlg_noantenna_title">Συνδέστε τα ακουστικά</string> + <string name="btn_yes">Ναι</string> + <string name="btn_no">Όχι</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Άκυρο</string> + <string name="dlg_progress_title">Σάρωση</string> + <string name="dlg_progress_text">Σάρωση καναλιών...</string> + <string name="dlg_addedit_station_name">Όνομα:</string> + <string name="dlg_addedit_station_freq">Συχνότητα:</string> + <string name="dlg_addedit_title_edit">Επεξεργασία καναλιού</string> + <string name="default_station_name">Νέο κανάλι</string> + <string name="dlg_delete_confirm_title">Επιβεβαίωση κατάργησης από τα αγαπημένα</string> + <string name="dlg_delete_confirm_text">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το κανάλι από τα αγαπημένα;</string> + <string name="toast_favorite_full">Δεν είναι δυνατή η προσθήκη του καναλιού στη λίστα αγαπημένων, επειδή είναι πλήρης.</string> + <string name="toast_already_favorite">Αυτό το κανάλι βρίσκεται ήδη στη λίστα αγαπημένων.</string> + <string name="toast_channel_deleted">Καταργήθηκε από τα αγαπημένα με επιτυχία.</string> + <string name="toast_channel_added">Προστέθηκε στα αγαπημένα με επιτυχία.</string> + <string name="toast_channel_searched">Έγινε αναζήτηση διαθέσιμων καναλιών:</string> + <string name="toast_cannot_search">Δεν είναι δυνατή η αναζήτηση διαθέσιμων καναλιών.</string> + <string name="toast_invalid_frequency">Μη έγκυρη συχνότητα για την τρέχουσα τοποθεσία. Έγκυρο εύρος συχνοτήτων: 87,5-108,0.</string> + <string name="optmenu_rds_settings">Ρυθμίσεις RDS</string> + <string name="dlg_rds_settings_channel_information">Πληροφορίες καναλιού</string> + <string name="dlg_rds_settings_alternative_frequency">Εναλλακτική συχνότητα</string> + <string name="sound_mode">Λειτουργία ήχου</string> + <string name="more">Περισσότερες εφαρμογές</string> + <string name="power">υψωμένο στη δύναμη</string> + <string name="edit_frequency_overwrite_text">"Αντικατάσταση"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Συνδέστε τα ακουστικά σας που λειτουργούν ως κεραία ραδιοφώνου. </string> + <!-- For FM recording --> + <string name="fm_recorder_name">Πρόγραμμα εγγραφής FM</string> + <string name="toast_recording_lost_warning">Η εγγραφή σας θα χαθεί λόγω αφαίρεσης της κάρτας SD!</string> + <string name="toast_start_recording">Έναρξη εγγραφής...</string> + <string name="toast_sdcard_missing">Η κάρτα SD λείπει!</string> + <string name="toast_sdcard_insufficient_space">Ανεπαρκής χώρος στην κάρτα SD!</string> + <string name="toast_recorder_internal_error">Παρουσιάστηκε εσωτερικό σφάλμα στο πρόγραμμα εγγραφής!</string> + <string name="toast_player_internal_error">Παρουσιάστηκε εσωτερικό σφάλμα στο πρόγραμμα αναπαραγωγής!</string> + <string name="toast_powerup_before_record_warning">Πρώτα ενεργοποιήστε τα FM!</string> + <string name="optmenu_record">Εγγραφή FM</string> + <string name="btn_save_recording">Αποθήκευση</string> + <string name="btn_discard_recording">Απόρριψη</string> + <string name="edit_recording_name_hint">Πληκτρολογήστε εδώ το όνομα αρχείου</string> + <string name="dlg_save_recording_title">Αποθήκευση αρχείου εγγραφής</string> + <string name="dlg_save_recording_storage_warning">Ανεπαρκής χώρος αποθήκευσης! Θέλετε να αποθηκεύσετε την τρέχουσα εγγραφή;</string> + <string name="already_exists">υπάρχει ήδη</string> + <string name="toast_invalid_input">Η τελευταία μη έγκυρη εισαγωγή, οι έγκυρες τιμές είναι 0 ή 5.</string> + <string name="toast_in_call">Δεν είναι δυνατή η εκκίνηση της εφαρμογής "Ραδιόφωνο FM" ενώ βρίσκεται σε εξέλιξη κλήση.</string> + <string name="empty_list">Η λίστα καναλιών είναι κενή.</string> + <string name="optmenu_speaker">"Ηχείο"</string> + <string name="optmenu_earphone">Ακουστικά</string> + <string name="not_available">Επί του παρόντος δεν είναι διαθέσιμη</string> + <string name="add_to_favorite1">Προσθήκη στα προκαθορισμένα κανάλια</string> + <string name="contmenu_item_delete1">Κατάργηση από τα προκαθορισμένα κανάλια</string> + <string name="dlg_delete_confirm_title1">Επιβεβαίωση κατάργησης από τα προκαθορισμένα κανάλια</string> + <string name="dlg_delete_confirm_text1">Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το κανάλι από τα προκαθορισμένα κανάλια;</string> + <string name="toast_favorite_full1">Δεν είναι δυνατή η προσθήκη αυτού του καναλιού στη λίστα προκαθορισμένων καναλιών, επειδή είναι πλήρης.</string> + <string name="toast_already_favorite1">Αυτό το κανάλι βρίσκεται ήδη στη λίστα προκαθορισμένων καναλιών.</string> + <string name="toast_channel_deleted1">Η κατάργηση από τα προκαθορισμένα κανάλια ολοκληρώθηκε με επιτυχία.</string> + <string name="toast_channel_added1">Η προσθήκη στα προκαθορισμένα κανάλια ολοκληρώθηκε με επιτυχία.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-en-rGB/strings.xml b/MediaTek/FmRadio/res/values-en-rGB/strings.xml new file mode 100755 index 0000000..adfec38 --- /dev/null +++ b/MediaTek/FmRadio/res/values-en-rGB/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM Radio</string> + <string name="favorite_manager">Channel list</string> + <string name="add_to_favorite">Add to Favourites</string> + <string name="optmenu_search">Search</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">Operations</string> + <string name="contmenu_item_edit">Edit</string> + <string name="contmenu_item_delete">Remove from favourites</string> + <string name="dlg_noantenna_text">You need an earphone cable as an antenna. Please plug in your earphone.</string> + <string name="dlg_noantenna_title">Plug in earphone</string> + <string name="btn_yes">"Yes"</string> + <string name="btn_no">"No"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Cancel</string> + <string name="dlg_progress_title">Search</string> + <string name="dlg_progress_text">Search channels...</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_station_freq">Frequency:</string> + <string name="dlg_addedit_title_edit">Edit Channel</string> + <string name="default_station_name">New Channel</string> + <string name="dlg_delete_confirm_title">Confirm remove from favourites</string> + <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favourites?</string> + <string name="toast_favorite_full">Cannot add channel to favourites because list is full.</string> + <string name="toast_already_favorite">This channel is already in the favourites list.</string> + <string name="toast_channel_deleted">Successfully removed from favourites.</string> + <string name="toast_channel_added">Successfully added to favourites.</string> + <string name="toast_channel_searched">Searched all available channels:</string> + <string name="toast_cannot_search">Cannot search all available channels.</string> + <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency range: 87,5 - 108,0</string> + <string name="toast_invalid_input">Last input invalid, valid value is 0 or 5.</string> + <string name="optmenu_rds_settings">RDS settings</string> + <string name="dlg_rds_settings_channel_information">Channel information</string> + <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string> + <string name="sound_mode">Sound mode</string> + <string name="more">"More"</string> + <string name="power">"Power"</string> + <string name="toast_in_call">Cannot launch FM Radio with a call in progress.</string> + <string name="empty_list">Channel list is empty.</string> + <string name="edit_frequency_overwrite_text">Overwrite</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Plug in earphones, lead acts as radio antenna.</string> + <string name="fm_recorder_name">FM Recorder</string> + <string name="toast_recording_lost_warning">Your recording will be lost if SD is removed!</string> + <string name="toast_start_recording">Start recording...</string> + <string name="toast_sdcard_missing">Your SD card is missing!</string> + <string name="toast_sdcard_insufficient_space">Insufficient space on SD card!</string> + <string name="toast_recorder_internal_error">Internal record error!</string> + <string name="toast_player_internal_error">Internal play error!</string> + <string name="toast_powerup_before_record_warning">Please power up FM first!</string> + <string name="optmenu_record">Record FM</string> + <string name="btn_save_recording">"Save"</string> + <string name="btn_discard_recording">Discard</string> + <string name="edit_recording_name_hint">Type file name here</string> + <string name="dlg_save_recording_title">Save recorded file</string> + <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string> + <string name="already_exists">already exists</string> + <string name="optmenu_speaker">Speaker</string> + <string name="optmenu_earphone">Earphone</string> + <string name="not_available">Currently not available</string> + <string name="add_to_favorite1">Add to preset channels</string> + <string name="contmenu_item_delete1">Remove from preset channels</string> + <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string> + <string name="dlg_delete_confirm_text1">Are you sure you want to remove this preset channel?</string> + <string name="toast_favorite_full1">Cannot add channel because preset list is full.</string> + <string name="toast_already_favorite1">This channel is already in the preset channel list.</string> + <string name="toast_channel_deleted1">Successfully removed from preset channels.</string> + <string name="toast_channel_added1">Successfully added to preset channels.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-en-rIN/strings.xml b/MediaTek/FmRadio/res/values-en-rIN/strings.xml new file mode 100755 index 0000000..b4d31e1 --- /dev/null +++ b/MediaTek/FmRadio/res/values-en-rIN/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM Radio</string> + <string name="dlg_progress_title">Search</string> + <string name="btn_yes">Yes</string> + <string name="optmenu_speaker">Speaker</string> + <string name="edit_frequency_overwrite_text">Overwrite</string> + <string name="toast_start_recording">Start recording...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Channel list is empty.</string> + <string name="optmenu_rds_settings">RDS settings</string> + <string name="toast_channel_searched">Searched out available channels:</string> + <string name="already_exists">already exists</string> + <string name="dlg_noantenna_title">Plug in earphone</string> + <string name="add_to_favorite">Add to Favorite</string> + <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string> + <string name="dlg_delete_confirm_title">Confirm removal from favorites</string> + <string name="optmenu_record">Record FM</string> + <string name="optmenu_earphone">Earphone</string> + <string name="sound_mode">Sound mode</string> + <string name="toast_already_favorite">This channel is already in favorite list.</string> + <string name="not_available">Currently not available</string> + <string name="toast_channel_deleted">Successfully removed from favorites.</string> + <string name="toast_channel_added">Successfully added to favorites.</string> + <string name="dlg_rds_settings_channel_information">Channel information</string> + <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string> + <string name="btn_save_recording">Save</string> + <string name="optmenu_search">Search</string> + <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string> + <string name="dlg_progress_text">Search channels...</string> + <string name="optmenu_exit">Exit</string> + <string name="more">More</string> + <string name="btn_discard_recording">Discard</string> + <string name="contmenu_item_edit">Edit</string> + <string name="toast_cannot_search">Cannot search available channel.</string> + <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string> + <string name="toast_in_call">You can not launch FM Radio when you are in call.</string> + <string name="dlg_addedit_station_freq">Frequency:</string> + <string name="toast_recorder_internal_error">An internal error occured in recorder!</string> + <string name="dlg_save_recording_title">Save recording file</string> + <string name="btn_ok">OK</string> + <string name="power">Power</string> + <string name="contmenu_item_delete">Remove from favorites</string> + <string name="toast_powerup_before_record_warning">Please switch on FM first!</string> + <string name="fm_recorder_name">FM Recorder</string> + <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string> + <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string> + <string name="default_station_name">New Channel</string> + <string name="btn_cancel">Cancel</string> + <string name="contmenu_title">Operations</string> + <string name="btn_no">No</string> + <string name="favorite_manager">Channel list</string> + <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string> + <string name="toast_sdcard_missing">Your SD card is missing!</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_title_edit">Edit Channel</string> + <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string> + <string name="edit_recording_name_hint">Type file name here</string> + <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string> + <string name="toast_player_internal_error">An internal error occured in player!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-en-rUS/strings.xml b/MediaTek/FmRadio/res/values-en-rUS/strings.xml new file mode 100755 index 0000000..043c43f --- /dev/null +++ b/MediaTek/FmRadio/res/values-en-rUS/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM Radio</string> + <string name="favorite_manager">Channel list</string> + <string name="add_to_favorite">Add to Favorite</string> + <string name="optmenu_search">Search</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">Operations</string> + <string name="contmenu_item_edit">Edit</string> + <string name="contmenu_item_delete">Remove from favorites</string> + <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string> + <string name="dlg_noantenna_title">Plug in earphone</string> + <string name="btn_yes">Yes</string> + <string name="btn_no">No</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Cancel</string> + <string name="dlg_progress_title">Search</string> + <string name="dlg_progress_text">Search channels...</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_station_freq">Frequency:</string> + <string name="dlg_addedit_title_edit">Edit Channel</string> + <string name="default_station_name">New Channel</string> + <string name="dlg_delete_confirm_title">Confirm remove from favorites</string> + <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string> + <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string> + <string name="toast_already_favorite">This channel is already in favorite list.</string> + <string name="toast_channel_deleted">Successfully removed from favorites.</string> + <string name="toast_channel_added">Successfully added to favorites.</string> + <string name="toast_channel_searched">Searched out available channels:</string> + <string name="toast_cannot_search">Cannot search out available channel.</string> + <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string> + <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string> + <string name="optmenu_rds_settings">RDS settings</string> + <string name="dlg_rds_settings_channel_information">Channel information</string> + <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string> + <string name="sound_mode">Sound mode</string> + <string name="more">More</string> + <string name="power">Power</string> + <string name="toast_in_call">You can not launch FM Radio when you are in call.</string> + <string name="empty_list">Channel list is empty.</string> + <string name="optmenu_speaker">Speaker</string> + <string name="optmenu_earphone">Earphone</string> + <string name="edit_frequency_overwrite_text">Overwrite</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Plug in your earphones to use as a radio antenna.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM Recorder</string> + <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string> + <string name="toast_start_recording">Start recording...</string> + <string name="toast_sdcard_missing">Your SD card is missing!</string> + <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string> + <string name="toast_recorder_internal_error">An internal error occured in recorder!</string> + <string name="toast_player_internal_error">An internal error occured in player!</string> + <string name="toast_powerup_before_record_warning">Please power up FM first!</string> + <string name="optmenu_record">Record FM</string> + <string name="btn_save_recording">Save</string> + <string name="btn_discard_recording">Discard</string> + <string name="edit_recording_name_hint">Type file name here</string> + <string name="dlg_save_recording_title">Save recording file</string> + <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string> + <string name="already_exists">already exists</string> + <string name="not_available">Currently not available</string> + <string name="add_to_favorite1">Add to preset channels</string> + <string name="contmenu_item_delete1">Remove from preset channels</string> + <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string> + <string name="dlg_delete_confirm_text1">Are you sure you want to remove this channel from preset channels?</string> + <string name="toast_favorite_full1">Cannot add the channel to preset channel list because it is full.</string> + <string name="toast_already_favorite1">This channel is already in preset channel list.</string> + <string name="toast_channel_deleted1">Successfully removed from preset channels.</string> + <string name="toast_channel_added1">Successfully added to preset channels.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-es-rUS/strings.xml b/MediaTek/FmRadio/res/values-es-rUS/strings.xml new file mode 100755 index 0000000..73abb52 --- /dev/null +++ b/MediaTek/FmRadio/res/values-es-rUS/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Radio FM</string> + <string name="favorite_manager">Lista de canales</string> + <string name="add_to_favorite">Añadir a Favoritos</string> + <string name="optmenu_search">Buscar</string> + <string name="optmenu_exit">Salir</string> + <string name="contmenu_title">Operaciones</string> + <string name="contmenu_item_edit">Editar</string> + <string name="contmenu_item_delete">Eliminar desde favoritos</string> + <string name="dlg_noantenna_text">Precisa un auricular como antena. Enchufe su auricular.</string> + <string name="dlg_noantenna_title">Enchufe auricular</string> + <string name="btn_yes">"Sí"</string> + <string name="btn_no">"No"</string> + <string name="btn_ok">Aceptar</string> + <string name="btn_cancel">Cancelar</string> + <string name="dlg_progress_title">Buscar</string> + <string name="dlg_progress_text">Buscar canales...</string> + <string name="dlg_addedit_station_name">Nombre:</string> + <string name="dlg_addedit_station_freq">Frecuencia:</string> + <string name="dlg_addedit_title_edit">Editar Canal</string> + <string name="default_station_name">Nuevo Canal</string> + <string name="dlg_delete_confirm_title">Confirmar eliminar de favoritos</string> + <string name="dlg_delete_confirm_text">¿Está seguro que desea eliminar este canal de favoritos?</string> + <string name="toast_favorite_full">No puede añadir el canal a la lista de favoritos porque está llena.</string> + <string name="toast_already_favorite">Este canal ya está en la lista de favoritos.</string> + <string name="toast_channel_deleted">Eliminado de favoritos con éxito.</string> + <string name="toast_channel_added">Añadido a favoritos con éxito.</string> + <string name="toast_channel_searched">Canales disponibles buscados:</string> + <string name="toast_cannot_search">No pueden buscarse los canales disponibles.</string> + <string name="toast_invalid_frequency">Frecuencia inválida para la ubicación actual. Ámbito de frecuencia inválida: 87,5-108,0</string> + <string name="toast_invalid_input">La última entrada inválida, el valor válido es 0 o 5.</string> + <string name="optmenu_rds_settings">Configuración RDS</string> + <string name="dlg_rds_settings_channel_information">Información de canal</string> + <string name="dlg_rds_settings_alternative_frequency">Frecuencia alternativa</string> + <string name="sound_mode">Modo de sonido</string> + <string name="more">"Más"</string> + <string name="power">"potencia"</string> + <string name="toast_in_call">No puede lanzar la Radio FM cuando está en una llamada.</string> + <string name="empty_list">La lista de canales está vacía.</string> + <string name="edit_frequency_overwrite_text">Sobrescribir</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Enchufar los auriculares para utilizar como antena de radio.</string> + <string name="fm_recorder_name">Grabadora FM</string> + <string name="toast_recording_lost_warning">¡Su grabación se perderá debido a la remoción de la SD!</string> + <string name="toast_start_recording">Iniciar grabación...</string> + <string name="toast_sdcard_missing">¡Falta su Tarjeta SD!</string> + <string name="toast_sdcard_insufficient_space">¡Espacio de tarjeta SD insuficiente!</string> + <string name="toast_recorder_internal_error">¡Ocurrió un error interno en la grabadora!</string> + <string name="toast_player_internal_error">¡Ocurrió un error interno en la reproductora!</string> + <string name="toast_powerup_before_record_warning">¡Inicie FM primero!</string> + <string name="optmenu_record">Grabar FM</string> + <string name="btn_save_recording">"Guardar"</string> + <string name="btn_discard_recording">Descartar</string> + <string name="edit_recording_name_hint">Ingresar el nombre del archivo aquí</string> + <string name="dlg_save_recording_title">Guardar archivo de grabación</string> + <string name="dlg_save_recording_storage_warning">¡Almacenamiento insuficiente! ¿Desea usted guardar la grabación actual?</string> + <string name="already_exists">ya existe</string> + <string name="optmenu_speaker">Altavoz</string> + <string name="optmenu_earphone">Auricular</string> + <string name="not_available">Actualmente no disponible</string> + <string name="add_to_favorite1">Añadir a los canales preseleccionados</string> + <string name="contmenu_item_delete1">Eliminar de canales preprogramados</string> + <string name="dlg_delete_confirm_title1">Confirmar eliminar de canales preconfigurados</string> + <string name="dlg_delete_confirm_text1">¿Está seguro que desea eliminar este canal de canales preconfigurados?</string> + <string name="toast_favorite_full1">No puede añadir el canal a la lista de canales preconfigurados porque está llena.</string> + <string name="toast_already_favorite1">Este canal ya está en la lista de favoritos preconfigurados.</string> + <string name="toast_channel_deleted1">Eliminado de canales preconfigurados con éxito.</string> + <string name="toast_channel_added1">Añadido a canales preconfigurados con éxito.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-es/strings.xml b/MediaTek/FmRadio/res/values-es/strings.xml new file mode 100755 index 0000000..1722396 --- /dev/null +++ b/MediaTek/FmRadio/res/values-es/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Transmisión FM</string> + <string name="favorite_manager">Lista de canales</string> + <string name="add_to_favorite">Agregar a favoritos</string> + <string name="optmenu_search">Búsqueda</string> + <string name="optmenu_exit">Salir</string> + <string name="contmenu_title">Operaciones</string> + <string name="contmenu_item_edit">Editar</string> + <string name="contmenu_item_delete">Quitar de favoritos</string> + <string name="dlg_noantenna_text">Necesita unos auriculares como antena. Enchufe los auriculares.</string> + <string name="dlg_noantenna_title">Enchufar el auricular</string> + <string name="btn_yes">Si</string> + <string name="btn_no">No</string> + <string name="btn_ok">Aceptar</string> + <string name="btn_cancel">Cancelar</string> + <string name="dlg_progress_title">Buscar</string> + <string name="dlg_progress_text">Buscar canales...</string> + <string name="dlg_addedit_station_name">Nombre:</string> + <string name="dlg_addedit_station_freq">Frecuencia: </string> + <string name="dlg_addedit_title_edit">Canal editar</string> + <string name="default_station_name">Canal nuevo</string> + <string name="dlg_delete_confirm_title">Confirmar eliminación de canal</string> + <string name="dlg_delete_confirm_text">¿Está seguro de que desea eliminar este canal?</string> + <string name="toast_favorite_full">No se puede agregar el canal a la lista de favoritos porque está llena.</string> + <string name="toast_already_favorite">Este canal ya está en la lista de favoritos.</string> + <string name="toast_channel_deleted">Se quitó de los favoritos correctamente.</string> + <string name="toast_channel_added">Se agregó a los favoritos correctamente.</string> + <string name="toast_channel_searched">Canales disponibles encontrados:</string> + <string name="toast_cannot_search">No se puede encontrar el canal disponible.</string> + <string name="optmenu_rds_settings">Configurar RDS</string> + <string name="dlg_rds_settings_channel_information">Información del canal</string> + <string name="dlg_rds_settings_alternative_frequency">Frecuencia alternativa</string> + <string name="more">Más aplicaciones</string> + <string name="power">potencia</string> + <string name="sound_mode">Modo de sonido</string> + <string name="edit_frequency_overwrite_text">"Sobrescribir"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Enchufe los auriculares para utilizarlos como antena de radio.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">Grabadora de FM</string> + <string name="toast_recording_lost_warning">¡La grabación se perderá debido a la eliminación de la tarjeta SD!</string> + <string name="toast_start_recording">Iniciar grabación…</string> + <string name="toast_sdcard_missing">La tarjeta SD no está presente!</string> + <string name="toast_sdcard_insufficient_space">¡Espacio en tarjeta SD insuficiente!</string> + <string name="toast_recorder_internal_error">¡Error interno en la grabadora!</string> + <string name="toast_player_internal_error">¡Error interno en el reproductor!</string> + <string name="toast_powerup_before_record_warning">¡Active primero FM!</string> + <string name="optmenu_record">Grabar FM</string> + <string name="btn_save_recording">Guardar</string> + <string name="btn_discard_recording">Descartar</string> + <string name="edit_recording_name_hint">Escribir aquí el nombre de archivo</string> + <string name="dlg_save_recording_title">Guardar archivo de grabación</string> + <string name="dlg_save_recording_storage_warning">¡Almacenamiento insuficiente! ¿Desea guardar la grabación actual?</string> + <string name="already_exists">Ya existe</string> + <string name="toast_invalid_frequency">Frecuencia no válida para la ubicación actual. Intervalo válido de frecuencias: 87,5-108,0.</string> + <string name="toast_invalid_input">La última entrada no es válida, un valor válido es 0 o 5.</string> + <string name="toast_in_call">No puede ejecutar la radio FM durante una llamada.</string> + <string name="empty_list">La lista de canales está vacía.</string> + <string name="optmenu_speaker">"Altavoz"</string> + <string name="optmenu_earphone">Auriculares</string> + <string name="not_available">Actualmente no disponible</string> + <string name="add_to_favorite1">Agregar a canales predefinidos</string> + <string name="contmenu_item_delete1">Quitar desde canales predefinidos</string> + <string name="dlg_delete_confirm_title1">Confirmar la eliminación desde canales predefinidos</string> + <string name="dlg_delete_confirm_text1">¿Está seguro de que desea quitar este canal desde los canales predefinidos?</string> + <string name="toast_favorite_full1">No se puede agregar el canal a la lista de canales predefinidos porque está llena.</string> + <string name="toast_already_favorite1">Este canal ya está en la lista de canales predefinidos.</string> + <string name="toast_channel_deleted1">La eliminación desde los canales predefinidos se realizó correctamente.</string> + <string name="toast_channel_added1">La adición a los canales predefinidos se realizó correctamente.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-et-rEE/strings.xml b/MediaTek/FmRadio/res/values-et-rEE/strings.xml new file mode 100755 index 0000000..db8035e --- /dev/null +++ b/MediaTek/FmRadio/res/values-et-rEE/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM raadio</string> + <string name="dlg_progress_title">Otsi</string> + <string name="btn_yes">Jah</string> + <string name="optmenu_speaker">Kõlar</string> + <string name="edit_frequency_overwrite_text">Kirjuta üle</string> + <string name="toast_start_recording">Alusta salvestamist...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Kanalite loend on tühi.</string> + <string name="optmenu_rds_settings">RDS seaded</string> + <string name="toast_channel_searched">Otsiti välja saadaolevad kanalid:</string> + <string name="already_exists">on juba olemas</string> + <string name="dlg_noantenna_title">Ühenda kõrvaklapid</string> + <string name="add_to_favorite">Lisa Lemmikutesse</string> + <string name="toast_sdcard_insufficient_space">SD kaardil pole piisavalt ruumi!</string> + <string name="dlg_delete_confirm_title">Kinnita lemmikutest eemaldamine</string> + <string name="optmenu_record">Salvesta FM</string> + <string name="optmenu_earphone">Kõrvaklapid</string> + <string name="sound_mode">Helirežiim</string> + <string name="toast_already_favorite">See kanal on juba lemmikute loendis.</string> + <string name="not_available">Ei ole praegu saadaval</string> + <string name="toast_channel_deleted">Lemmikutest eemaldamine õnnestus.</string> + <string name="toast_channel_added">Lemmikutesse lisamine õnnestus.</string> + <string name="dlg_rds_settings_channel_information">Kanali teave</string> + <string name="toast_favorite_full">Ei saa lisada kanalit lemmikute loendisse, kuna see on täis.</string> + <string name="btn_save_recording">Salvesta</string> + <string name="optmenu_search">Otsi</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatiivne sagedus</string> + <string name="dlg_progress_text">Otsi kanaleid...</string> + <string name="optmenu_exit">Välju</string> + <string name="more">Veel</string> + <string name="btn_discard_recording">Likvideeri</string> + <string name="contmenu_item_edit">Redigeeri</string> + <string name="toast_cannot_search">Ei saa saadaolevat kanalit välja otsida.</string> + <string name="dlg_save_recording_storage_warning">Pole piisavalt mälu! Kas soovid praeguse salvestuse salvestada?</string> + <string name="toast_in_call">Sa ei saa käivitada FM raadiot helistamise ajal.</string> + <string name="dlg_addedit_station_freq">Sagedus:</string> + <string name="toast_recorder_internal_error">Salvestil ilmnes sisetõrge!</string> + <string name="dlg_save_recording_title">Salvesta salvestusfail</string> + <string name="btn_ok">OK</string> + <string name="power">Võimsus</string> + <string name="contmenu_item_delete">Eemalda lemmikutest</string> + <string name="toast_powerup_before_record_warning">Lülita kõigepealt FM sisse!</string> + <string name="no_antenna_info">Ühendage kõrvaklapid, et kasutada neid raadioantennina.</string> + <string name="fm_recorder_name">FM salvesti</string> + <string name="toast_recording_lost_warning">Sinu salvestus läheb SD eemaldamise tõttu kaotsi!</string> + <string name="dlg_delete_confirm_text">Kas soovid kindlasti selle kanali lemmikutest eemaldada?</string> + <string name="default_station_name">Uus kanal</string> + <string name="btn_cancel">Loobu</string> + <string name="contmenu_title">Toimingud</string> + <string name="btn_no">Ei</string> + <string name="favorite_manager">Kanalite loend</string> + <string name="toast_invalid_frequency">Vigane sagedus praeguse asukoha jaoks. Kehtiv sagedusulatus: 87,5-108,0</string> + <string name="toast_sdcard_missing">SD kaart puudub!</string> + <string name="dlg_addedit_station_name">Nimi:</string> + <string name="dlg_addedit_title_edit">Redigeeri kanalit</string> + <string name="toast_invalid_input">Viimane vigane sisestus, õige väärtus on 0 või 5.</string> + <string name="edit_recording_name_hint">Sisesta faili nimi siin</string> + <string name="dlg_noantenna_text">Sa vajad kõrvaklappe antenniks. Ühenda oma kõrvaklapid.</string> + <string name="toast_player_internal_error">Pleieril ilmnes sisetõrge!</string> + <string name="add_to_favorite1">Lisa eelseatud kanalitesse</string> + <string name="contmenu_item_delete1">Eemalda eelseatud kanalitest</string> + <string name="dlg_delete_confirm_title1">Kinnita eelseatud kanalitest eemaldamine</string> + <string name="dlg_delete_confirm_text1">Kas soovid kindlasti selle kanali eelseatud kanalitest eemaldada?</string> + <string name="toast_favorite_full1">Ei saa lisada kanalit eelseatud kanalite loendisse, kuna see on täis.</string> + <string name="toast_already_favorite1">See kanal on juba eelseatud kanalite loendis.</string> + <string name="toast_channel_deleted1">Eelseatud kanalitest eemaldamine õnnestus.</string> + <string name="toast_channel_added1">Eelseatud kanalitesse lisamine õnnestus.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-fa/strings.xml b/MediaTek/FmRadio/res/values-fa/strings.xml new file mode 100755 index 0000000..868031a --- /dev/null +++ b/MediaTek/FmRadio/res/values-fa/strings.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">راديو FM</string> + <string name="favorite_manager">فهرست کانال</string> + <string name="add_to_favorite">افزودن به علاقمندی</string> + <string name="optmenu_search">جستجو</string> + <string name="optmenu_exit">خروج</string> + <string name="contmenu_title">عمليات</string> + <string name="contmenu_item_edit">ويرايش</string> + <string name="contmenu_item_delete">حذف از موارد موردعلاقه </string> + <string name="dlg_noantenna_text">شما به هدفون در نقش آنتن نیاز دارید. لطفا گوشی خود را وصل کنید.</string> + <string name="dlg_noantenna_title">هدفون را وارد کنيد</string> + <string name="btn_yes">بله</string> + <string name="btn_no">خير</string> + <string name="btn_ok">تاييد</string> + <string name="btn_cancel">لغو</string> + <string name="dlg_progress_title">اسکن</string> + <string name="dlg_progress_text">اسکن کانال ها...</string> + <string name="dlg_addedit_station_name">نام:</string> + <string name="dlg_addedit_station_freq">تکرار:</string> + <string name="dlg_addedit_title_edit">ويرايش کانال</string> + <string name="default_station_name">کانال جديد</string> + <string name="dlg_delete_confirm_title">تاييد حذف کانال</string> + <string name="dlg_delete_confirm_text">آيا از حذف اين کانال مطمئن هستيد؟</string> + <string name="toast_favorite_full">افزودن کانال به فهرست علاقمندی ممکن نيست زيرا فهرست پر است.</string> + <string name="toast_already_favorite">اين کانال هم اکنون در فهرست علاقمندی موجود است.</string> + <string name="toast_channel_deleted">از موارد موردعلاقه حذف شد</string> + <string name="toast_channel_added">به موارد موردعلاقه اضافه شد</string> + <string name="toast_channel_searched">کانالهای موجود پيدا شده:</string> + <string name="toast_cannot_search">کانالی يافت نشد.</string> + <string name="optmenu_rds_settings">تنظيمات RDS</string> + <string name="dlg_rds_settings_channel_information">اطلاعات کانال</string> + <string name="dlg_rds_settings_alternative_frequency">فرکانس جايگزين</string> + <string name="more">برنامههای کاربردی بیشتر</string> + <string name="power">توان</string> + <string name="sound_mode">حالت صدا</string> + <string name="fm_unit">مگاهرتز</string> + <string name="no_antenna_info">گوشی ها را وصل کنید تا از آن به عنوان آنتن رادیو استفاده شود.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"رونویسی"</string> + <string name="fm_recorder_name">ضبط FM</string> + <string name="toast_recording_lost_warning">به دلیل خارج شدن SD، مورد ضبط شده شما از بین خواهد رفت!</string> + <string name="toast_start_recording">شروع ضبط…</string> + <string name="toast_sdcard_missing">کارت SD شما وجود ندارد!</string> + <string name="toast_sdcard_insufficient_space">کارت SD شما وجود ندارد!</string> + <string name="toast_recorder_internal_error">فضای کارت SD کافی نیست!</string> + <string name="toast_player_internal_error">یک خطای داخلی در ضبط کننده رخ داد!</string> + <string name="toast_powerup_before_record_warning">لطفا ابتدا FM را روشن کنید!</string> + <string name="optmenu_record">ضبط FM</string> + <string name="btn_save_recording">ذخيره</string> + <string name="btn_discard_recording">صرفنظر</string> + <string name="edit_recording_name_hint">نام فایل را در اینجا تایپ کنید</string> + <string name="dlg_save_recording_title">ذخیره فایل ضبط</string> + <string name="dlg_save_recording_storage_warning">حافظه ناکافی! مایلید مورد ضبط شده فعلی را ذخیره کنید؟</string> + <string name="already_exists">تکراری</string> + <string name="toast_invalid_frequency">فرکانس مکان فعلی نامعتبر است. محدوده فرکانس معتبر: 87,5 تا 108,0.</string> + <string name="toast_invalid_input">آخرین ورودی نامعتبر، ارزش معتبر 0 یا 5 است.</string> + <string name="toast_in_call">زمانی که در حال مکالمه هستید نمی توانید رادیو FM را راه اندازی کنید.</string> + <string name="empty_list">لیست کانال خالی است.</string> + <string name="optmenu_speaker">"بلندگو"</string> + <string name="optmenu_earphone">هدست</string> + <string name="not_available">فعلا در دسترس نیست</string> + <string name="add_to_favorite1">افزودن به کانال های از پیش تنظیم شده</string> + <string name="contmenu_item_delete1">حذف از کانال های از پیش تنظیم شده</string> + <string name="dlg_delete_confirm_title1">حذف از کانال های از پیش تنظیم شده را تایید کنید</string> + <string name="dlg_delete_confirm_text1">آیا از حذف این کانال از کانال های از پیش تنظیم شده مطمئن هستید؟</string> + <string name="toast_favorite_full1">افزودن این کانال به فهرست کانال های از پیش تنظیم شده امکان پذیر نیست زیرا این فهرست پر است.</string> + <string name="toast_already_favorite1">این کانال در فهرست کانال های از پیش تنظیم شده موجود است.</string> + <string name="toast_channel_deleted1">با موفقیت از کانال های از پیش تنظیم شده حذف شد.</string> + <string name="toast_channel_added1">با موفقیت به کانال های از پیش تنظیم شده اضافه شد.</string> +</resources> + diff --git a/MediaTek/FmRadio/res/values-fi/strings.xml b/MediaTek/FmRadio/res/values-fi/strings.xml new file mode 100755 index 0000000..16d5977 --- /dev/null +++ b/MediaTek/FmRadio/res/values-fi/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-radio</string> + <string name="favorite_manager">Kanavaluettelo</string> + <string name="add_to_favorite">Lisää suosikkeihin</string> + <string name="optmenu_search">Etsi</string> + <string name="optmenu_exit">Lopeta</string> + <string name="contmenu_title">Toiminnot</string> + <string name="contmenu_item_edit">Muokkaa</string> + <string name="contmenu_item_delete">Poista suosikeista</string> + <string name="dlg_noantenna_text">Tarvitset kuulokkeet antenniksi. Liitä kuulokkeet.</string> + <string name="dlg_noantenna_title">Liitä kuuloke</string> + <string name="btn_yes">"Kyllä"</string> + <string name="btn_no">"Ei"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Peru</string> + <string name="dlg_progress_title">Etsi</string> + <string name="dlg_progress_text">Hae kanavia...</string> + <string name="dlg_addedit_station_name">Nimi:</string> + <string name="dlg_addedit_station_freq">Taajuus:</string> + <string name="dlg_addedit_title_edit">Muokkaa kanavaa</string> + <string name="default_station_name">Uusi kanava</string> + <string name="dlg_delete_confirm_title">Vahvista poistaminen suosikeista</string> + <string name="dlg_delete_confirm_text">Haluatko varmasti poistaa tämän kanavan suosikeista?</string> + <string name="toast_favorite_full">Kanavaa ei voi lisätä suosikkilistaan, koska se on täynnä.</string> + <string name="toast_already_favorite">Tämä kanava on jo suosikkilistallasi.</string> + <string name="toast_channel_deleted">Poistaminen suosikeista onnistui.</string> + <string name="toast_channel_added">Suosikkeihin lisääminen onnistui.</string> + <string name="toast_channel_searched">Haetut käytettävissä olevat kanavat:</string> + <string name="toast_cannot_search">Ei voi hakea käytettävissä olevia kanavia.</string> + <string name="toast_invalid_frequency">Väärä taajuus nykyiselle sijainnille. Kelvollinen taajuusalue: 87,5-108,0</string> + <string name="toast_invalid_input">Viimeinen virheellinen syöte, kelvollinen arvo on 0 tai 5.</string> + <string name="optmenu_rds_settings">RDS-asetukset</string> + <string name="dlg_rds_settings_channel_information">Kanavatiedot</string> + <string name="dlg_rds_settings_alternative_frequency">Vaihtoehtoinen taajuus</string> + <string name="sound_mode">Äänitila</string> + <string name="more">"Lisää"</string> + <string name="power">"potenssi"</string> + <string name="toast_in_call">Et voi käynnistää FM-radiota kesken puhelun.</string> + <string name="empty_list">Kanavaluettelo on tyhjä.</string> + <string name="edit_frequency_overwrite_text">Korvaa</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Liitä korvanapit radioantennina käytettäväksi.</string> + <string name="fm_recorder_name">FM-tallennin</string> + <string name="toast_recording_lost_warning">Tallennuksesi menetetään, koska SD-kortti irrotettiin!</string> + <string name="toast_start_recording">Käynnistä tallennus...</string> + <string name="toast_sdcard_missing">SD-kortti puuttuu!</string> + <string name="toast_sdcard_insufficient_space">SD-kortin tila ei riitä!</string> + <string name="toast_recorder_internal_error">Tallentimessa ilmeni sisäinen virhe!</string> + <string name="toast_player_internal_error">Soittimessa ilmeni sisäinen virhe!</string> + <string name="toast_powerup_before_record_warning">Käynnistä ensin FM!</string> + <string name="optmenu_record">Tallenna FM</string> + <string name="btn_save_recording">"Tallenna"</string> + <string name="btn_discard_recording">Hylkää</string> + <string name="edit_recording_name_hint">Näppäile tiedostonimi tässä</string> + <string name="dlg_save_recording_title">Tallenna tallennetiedosto</string> + <string name="dlg_save_recording_storage_warning">Tallennustila ei riitä! Haluatko tallentaa nykyisen tallenteen?</string> + <string name="already_exists">on jo olemassa</string> + <string name="optmenu_speaker">Kaiutin</string> + <string name="optmenu_earphone">Kuulokkeet</string> + <string name="not_available">Ei tällä hetkellä käytettävissä</string> + <string name="add_to_favorite1">Lisää esiasetettuihin kanaviin</string> + <string name="contmenu_item_delete1">Poista esiasetetuista kanavista</string> + <string name="dlg_delete_confirm_title1">Vahvista poistaminen esiasetetuista kanavista</string> + <string name="dlg_delete_confirm_text1">Haluatko varmasti poistaa tämän kanavan esiasetetuista kanavista?</string> + <string name="toast_favorite_full1">Kanavaa ei voi lisätä esiasetettujen kanavien luetteloon, koska se on täynnä.</string> + <string name="toast_already_favorite1">Tämä kanava on jo esiasetettujen kanavien luettelossa.</string> + <string name="toast_channel_deleted1">Poistaminen esiasetetuista kanavista onnistui.</string> + <string name="toast_channel_added1">Lisääminen esiasetettuihin kanaviin onnistui.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-fr-rCA/strings.xml b/MediaTek/FmRadio/res/values-fr-rCA/strings.xml new file mode 100755 index 0000000..d5fe4e3 --- /dev/null +++ b/MediaTek/FmRadio/res/values-fr-rCA/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Radio FM</string> + <string name="dlg_progress_title">Recherche</string> + <string name="btn_yes">Oui</string> + <string name="optmenu_speaker">Haut-parleur</string> + <string name="edit_frequency_overwrite_text">Écraser</string> + <string name="toast_start_recording">Démarrer l\'enregistrement...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">La liste des stations est vide.</string> + <string name="optmenu_rds_settings">Paramètres RDS</string> + <string name="toast_channel_searched">Stations disponibles recherchées :</string> + <string name="already_exists">existe (ent) déjà</string> + <string name="dlg_noantenna_title">Brancher l\'écouteur</string> + <string name="add_to_favorite">Ajouter aux favoris</string> + <string name="toast_sdcard_insufficient_space">Espace insuffisant pour la carte SD!</string> + <string name="dlg_delete_confirm_title">Confirmer la suppression des favoris</string> + <string name="optmenu_record">Enregistrement FM</string> + <string name="optmenu_earphone">Écouteur</string> + <string name="sound_mode">Mode son</string> + <string name="toast_already_favorite">Cette station est déjà dans la liste des favoris.</string> + <string name="not_available">Actuellement non disponible</string> + <string name="toast_channel_deleted">Retiré avec succès des favoris.</string> + <string name="toast_channel_added">Ajouté avec succès aux favoris.</string> + <string name="dlg_rds_settings_channel_information">Informations sur la station</string> + <string name="toast_favorite_full">La station ne peut être ajoutée à la liste des favoris car celle-ci est pleine.</string> + <string name="btn_save_recording">Sauvegarder</string> + <string name="optmenu_search">Rechercher</string> + <string name="dlg_rds_settings_alternative_frequency">Fréquence alternative</string> + <string name="dlg_progress_text">Recherche de stations...</string> + <string name="optmenu_exit">Quitter</string> + <string name="more">Plus</string> + <string name="btn_discard_recording">Supprimer</string> + <string name="contmenu_item_edit">Modifier </string> + <string name="toast_cannot_search">Impossible de rechercher la station disponible.</string> + <string name="dlg_save_recording_storage_warning">Espace de stockage insuffisant! Sauvegarder l\'enregistrement en cours?</string> + <string name="toast_in_call">Impossible de démarrer la radio FM en cours d\'appel</string> + <string name="dlg_addedit_station_freq">Fréquence :</string> + <string name="toast_recorder_internal_error">Une erreur interne s\'est produite dans l\'enregistreur!</string> + <string name="dlg_save_recording_title">Sauvegarde du fichier d\'enregistrement</string> + <string name="btn_ok">OK</string> + <string name="power">Alimentation</string> + <string name="contmenu_item_delete">Suppression des favoris</string> + <string name="toast_powerup_before_record_warning">Veuillez allumer le FM d\'abord!</string> + <string name="fm_recorder_name">Enregistreur FM</string> + <string name="toast_recording_lost_warning">Votre enregistrement sera perdu en raison de l\'enlèvement SD!</string> + <string name="dlg_delete_confirm_text">Supprimer cette station des favoris?</string> + <string name="default_station_name">Nouvelle station</string> + <string name="btn_cancel">Annuler</string> + <string name="contmenu_title">Fonctionnement</string> + <string name="btn_no">Non</string> + <string name="favorite_manager">Liste des stations</string> + <string name="toast_invalid_frequency">Fréquence non valide pour l\'emplacement actuel. Gamme de fréquences valides: 87.5-108.0</string> + <string name="toast_sdcard_missing">Votre carte SD est introuvable!</string> + <string name="dlg_addedit_station_name">Nom :</string> + <string name="dlg_addedit_title_edit">Modifier la station</string> + <string name="toast_invalid_input">Dernière entrée non valide; la valeur valide est 0 ou 5.</string> + <string name="edit_recording_name_hint">Tapez le nom de fichier ici</string> + <string name="dlg_noantenna_text">Un écouteur est requis en guise d\'antenne. Veuillez brancher votre écouteur.</string> + <string name="toast_player_internal_error">Une erreur interne s\'est produite dans le lecteur!</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-fr/strings.xml b/MediaTek/FmRadio/res/values-fr/strings.xml new file mode 100755 index 0000000..77ff4ec --- /dev/null +++ b/MediaTek/FmRadio/res/values-fr/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Émission FM</string> + <string name="favorite_manager">Liste des chaînes</string> + <string name="add_to_favorite">Ajouter aux favoris</string> + <string name="optmenu_search">Recherche</string> + <string name="optmenu_exit">Sortie</string> + <string name="contmenu_title">Opérations</string> + <string name="contmenu_item_edit">Modifier</string> + <string name="contmenu_item_delete">Retirer des favoris</string> + <string name="dlg_noantenna_text">"Vous avez besoin d'un casque comme antenne. Veuillez brancher votre casque d'écoute."</string> + <string name="dlg_noantenna_title">Branchez l\'écouteur</string> + <string name="btn_yes">Oui</string> + <string name="btn_no">Non</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Annuler</string> + <string name="dlg_progress_title">Rechercher</string> + <string name="dlg_progress_text">Balayer les chaînes…</string> + <string name="dlg_addedit_station_name">Nom:</string> + <string name="dlg_addedit_station_freq">Fréquence:</string> + <string name="dlg_addedit_title_edit">Modifier la chaîne </string> + <string name="default_station_name">Nouvelle chaîne</string> + <string name="dlg_delete_confirm_title">Confirmer la suppression de station</string> + <string name="dlg_delete_confirm_text">Etes-vous sûr de vouloir supprimer cette station?</string> + <string name="toast_favorite_full">Impossible d\'ajouter la station à la liste des favoris, parce qu\'elle est pleine.</string> + <string name="toast_already_favorite">Cette station est déjà dans la liste des favoris.</string> + <string name="toast_channel_deleted">Retrait des favoris réussi</string> + <string name="toast_channel_added">Ajout au favoris réussi</string> + <string name="toast_channel_searched">Canaux disponibles trouvés :</string> + <string name="toast_cannot_search">Impossible de chercher les canaux disponibles.</string> + <string name="optmenu_rds_settings">Paramètres RDS</string> + <string name="dlg_rds_settings_channel_information">Informations sur le canal</string> + <string name="dlg_rds_settings_alternative_frequency">Fréquence alternative</string> + <string name="more">Autres applications</string> + <string name="power">puissance</string> + <string name="sound_mode">Mode audio</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Branchez vos oreillettes pour les utiliser comme antenne radio.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Remplacer"</string> + <string name="fm_recorder_name">Enregistreur FM</string> + <string name="toast_recording_lost_warning">Votre enregistrement sera perdu suite au retrait de la carte SD!</string> + <string name="toast_start_recording">"Démarrer l'enregistrement…"</string> + <string name="toast_sdcard_missing">Carte SD manquante!</string> + <string name="toast_sdcard_insufficient_space">Espace insuffisant sur carte SD!</string> + <string name="toast_recorder_internal_error">"Une erreur interne est survenue dans l'enregistreur!"</string> + <string name="toast_player_internal_error">Une erreur interne est survenue dans le lecteur!</string> + <string name="toast_powerup_before_record_warning">"Veuillez d'abord allumer FM!"</string> + <string name="optmenu_record">Enregistrer FM</string> + <string name="btn_save_recording">Sauvegarder</string> + <string name="btn_discard_recording">Rejeter</string> + <string name="edit_recording_name_hint">Saisissez le nom du fichier ici</string> + <string name="dlg_save_recording_title">"Sauvegarder le fichier d'enregistrement"</string> + <string name="dlg_save_recording_storage_warning">"Stockage insuffisant! Sauvegarder l'enregistrement en cours?"</string> + <string name="already_exists">Existe déjà</string> + <string name="toast_invalid_frequency">Fréquence invalide pour cet emplacement. Plage de fréquence valide: 87,5-108,0.</string> + <string name="toast_invalid_input">Dernière saisie invalide, valeur valide de 0 ou 5.</string> + <string name="toast_in_call">"Impossible d'activer la radio FM lorsqu'un appel est en cours."</string> + <string name="empty_list">La liste des chaînes est vide.</string> + <string name="optmenu_speaker">"Haut-parleur"</string> + <string name="optmenu_earphone">"Casque d'écoute"</string> + <string name="not_available">Actuellement indisponible</string> + <string name="add_to_favorite1">Ajouter aux chaînes préréglées</string> + <string name="contmenu_item_delete1">Retirer des chaînes préréglées</string> + <string name="dlg_delete_confirm_title1">Confirmer le retrait des chaînes préréglées</string> + <string name="dlg_delete_confirm_text1">Confirmer le retrait de cette chaîne des chaînes préréglées?</string> + <string name="toast_favorite_full1">"Impossible d'ajouter la chaîne aux chaînes préréglées car liste pleine."</string> + <string name="toast_already_favorite1">Cette chaîne figure déjà dans la liste.</string> + <string name="toast_channel_deleted1">Retrait réussi des chaînes préréglées.</string> + <string name="toast_channel_added1">Ajout réussi aux chaînes préréglées.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-hi/strings.xml b/MediaTek/FmRadio/res/values-hi/strings.xml new file mode 100755 index 0000000..277fe06 --- /dev/null +++ b/MediaTek/FmRadio/res/values-hi/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">एफएम रेडियो</string> + <string name="favorite_manager">चैनल सूची</string> + <string name="add_to_favorite">पसंदीदा में जोड़ें</string> + <string name="optmenu_search">खोजें</string> + <string name="optmenu_exit">बाहर</string> + <string name="contmenu_title">कार्य</string> + <string name="contmenu_item_edit">संपादन</string> + <string name="contmenu_item_delete">पसंदीदा से हटाएं</string> + <string name="dlg_noantenna_text">आपको एंटिना के रूप में एक ईयरफ़ोन की जरूरत है। कृपया अपने ईयरफ़ोन का प्लग लगा लें।</string> + <string name="dlg_noantenna_title">ईयरफोन का प्लग लगाएं</string> + <string name="btn_yes">हाँ</string> + <string name="btn_no">नहीं</string> + <string name="btn_ok">ठीक</string> + <string name="btn_cancel">रद्द</string> + <string name="dlg_progress_title">स्कैन करें</string> + <string name="dlg_progress_text">चैनल स्कैन करें...</string> + <string name="dlg_addedit_station_name">नाम</string> + <string name="dlg_addedit_station_freq">आवृत्ति:</string> + <string name="dlg_addedit_title_edit">चैनल संपादित करें</string> + <string name="default_station_name">नया चैनल</string> + <string name="dlg_delete_confirm_title">डिलीट चैनल की पुष्टि करें</string> + <string name="dlg_delete_confirm_text">क्या आप निश्चित हैं कि आप यह चैनल मिटाना चाहते हैं?</string> + <string name="toast_favorite_full">चैनल को पसंदीदा सूची में नहीं जोड़ सकते क्योंकि यह भरी हुई है।</string> + <string name="toast_already_favorite">यह चैनल पहले से पसंदीदा सूची में है।</string> + <string name="toast_channel_deleted">पसंदीदा से सफलतापूर्वक हटा</string> + <string name="toast_channel_added">पसंदीदा में सफलतापूर्वक जुड़ा</string> + <string name="toast_channel_searched">उपलब्ध चैनल को खोजा गया:</string> + <string name="toast_cannot_search">उपलब्ध चैनल को सर्च नहीं कर सकता।</string> + <string name="optmenu_rds_settings">RDS सेटिंग</string> + <string name="dlg_rds_settings_channel_information">चैनल सूचना</string> + <string name="dlg_rds_settings_alternative_frequency">वैकल्पिक फ्रीक्वेंसी</string> + <string name="more">अधिक अनुप्रयोग</string> + <string name="power">घात</string> + <string name="sound_mode">ध्वनि मोड</string> + <string name="edit_frequency_overwrite_text">"ओवरराइट करें"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">इयरफ़ोन को रेडियो एंटीना के रूप में उपयोग करने के लिए प्लग-इन करें।</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM रिकॉर्डर</string> + <string name="toast_recording_lost_warning">आपकी रिकॉर्डिंग SD हटाने के कारण गुम हो जाएगी!</string> + <string name="toast_start_recording">रिकॉर्डिंग आरंभ करें…</string> + <string name="toast_sdcard_missing">आपका SD कार्ड मौजूद नहीं है!</string> + <string name="toast_sdcard_insufficient_space">अपर्याप्त SD कार्ड स्थान!</string> + <string name="toast_recorder_internal_error">रिकॉर्डर में एक आंतरिक त्रुटि घटित हुई!</string> + <string name="toast_player_internal_error">प्लेयर में एक आंतरिक त्रुटि घटित हुई!</string> + <string name="toast_powerup_before_record_warning">कृपया पहले FM को पावर अप करें!</string> + <string name="optmenu_record">FM रिकॉर्ड करें</string> + <string name="btn_save_recording">सहेजें</string> + <string name="btn_discard_recording">छोड़ें</string> + <string name="edit_recording_name_hint">फ़ाइल का नाम यहां टाइप करें</string> + <string name="dlg_save_recording_title">रिकॉर्डिंग फ़ाइल सहेजें</string> + <string name="dlg_save_recording_storage_warning">अपर्याप्त भंडारण! क्या आप वर्तमान रिकॉर्डिंग सहेजना चाहते हैं?</string> + <string name="already_exists">पहले से ही मौजूद हैं</string> + <string name="toast_invalid_frequency">वर्तमान स्थान के लिए अमान्य फ्रीक्वेंसी। मान्य फ्रीक्वेंसी विस्तार: 87.5-108.0</string> + <string name="toast_invalid_input">अंतिम अमान्य इनपुट, मान्य मान 0 या 5 है।</string> + <string name="toast_in_call">आप कॉल के दौरान FM रेडियो चालू नहीं कर सकते।</string> + <string name="empty_list">चैनल सूची खाली है।</string> + <string name="optmenu_speaker">"स्पीकर"</string> + <string name="optmenu_earphone">हेडसेट</string> + <string name="not_available">वर्तमान में उपलब्ध नहीं है</string> + <string name="add_to_favorite1">प्रीसेट चैनल में जोड़ें</string> + <string name="contmenu_item_delete1">प्रीसेट चैनल से हटाएँ</string> + <string name="dlg_delete_confirm_title1">प्रीसेट चैनल से हटाने की पुष्टि करें</string> + <string name="dlg_delete_confirm_text1">क्या आप वाकई इस चैनल को प्रीसेट चैनल से हटाना चाहते हैं?</string> + <string name="toast_favorite_full1">चैनल को प्रीसेट चैनल सूची में नहीं जोड़ सकते क्योंकि यह भरी है।</string> + <string name="toast_already_favorite1">यह चैनल पहले से ही प्रीसेट चैनल सूची में मौजूद है।</string> + <string name="toast_channel_deleted1">प्रीसेट चैनल से सफलतापूर्वक हटा।</string> + <string name="toast_channel_added1">प्रीसेट चैनल में सफलतापूर्वक जुड़ा।</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-hr/strings.xml b/MediaTek/FmRadio/res/values-hr/strings.xml new file mode 100755 index 0000000..5d65109 --- /dev/null +++ b/MediaTek/FmRadio/res/values-hr/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM radio</string> + <string name="favorite_manager">Popis kanala</string> + <string name="add_to_favorite">Dodaj u favorite</string> + <string name="optmenu_search">Pretraži</string> + <string name="optmenu_exit">Izlaz</string> + <string name="contmenu_title">Operacije</string> + <string name="contmenu_item_edit">Uredi</string> + <string name="contmenu_item_delete">Ukloni iz favorita</string> + <string name="dlg_noantenna_text">Potrebna je slušalica kao antena. Priključite slušalicu.</string> + <string name="dlg_noantenna_title">Priključite slušalicu</string> + <string name="btn_yes">"Da"</string> + <string name="btn_no">"Ne"</string> + <string name="btn_ok">U redu</string> + <string name="btn_cancel">Otkaži</string> + <string name="dlg_progress_title">Pretraži</string> + <string name="dlg_progress_text">Pretraži kanale...</string> + <string name="dlg_addedit_station_name">Naziv:</string> + <string name="dlg_addedit_station_freq">Frekvencija:</string> + <string name="dlg_addedit_title_edit">Uredi kanal</string> + <string name="default_station_name">Novi kanal</string> + <string name="dlg_delete_confirm_title">Potvrdi uklanjanje iz favorita</string> + <string name="dlg_delete_confirm_text">Jeste li sigurni da želite ukloniti ovaj kanal iz favorita?</string> + <string name="toast_favorite_full">Ne može se dodati kanal na popis favorita jer je on pun.</string> + <string name="toast_already_favorite">Ovaj kanal već je na popisu favorita.</string> + <string name="toast_channel_deleted">Uspješno uklonjen iz favorita.</string> + <string name="toast_channel_added">Uspješno dodan u favorite.</string> + <string name="toast_channel_searched">Pronađeni su dostupni kanali:</string> + <string name="toast_cannot_search">Ne može se pronaći dostupni kanal.</string> + <string name="toast_invalid_frequency">Neispravna frekvencija za trenutnu lokaciju. Ispravni raspon frekvencije: 87,5-108,0</string> + <string name="toast_invalid_input">Posljednji neispravni unos, ispravna vrijednost je od 0 do 5.</string> + <string name="optmenu_rds_settings">Postavke RDS-a</string> + <string name="dlg_rds_settings_channel_information">Podaci o kanalu</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativna frekvencija</string> + <string name="sound_mode">Način zvuka</string> + <string name="more">"Više"</string> + <string name="power">"snaga"</string> + <string name="toast_in_call">Ne možete pokrenuti FM Radio kada ste u pozivu.</string> + <string name="empty_list">Popis kanala je prazan.</string> + <string name="edit_frequency_overwrite_text">Presnimi</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Priključite slušalice radi korištenja kao radijske antene.</string> + <string name="fm_recorder_name">FM snimač</string> + <string name="toast_recording_lost_warning">Vaša snimka će biti izgubljena zbog uklanjanja SD kartice!</string> + <string name="toast_start_recording">Početak snimanja...</string> + <string name="toast_sdcard_missing">Nema vaše SD kartice!</string> + <string name="toast_sdcard_insufficient_space">Na SD kartici nema dovoljno mjesta!</string> + <string name="toast_recorder_internal_error">Na snimaču se pojavila unutarnja greška!</string> + <string name="toast_player_internal_error">U programu za reprodukciju se pojavila unutarnja greška!</string> + <string name="toast_powerup_before_record_warning">Prvo pokrenite FM!</string> + <string name="optmenu_record">Snimaj FM</string> + <string name="btn_save_recording">"Spremi"</string> + <string name="btn_discard_recording">Odbaci</string> + <string name="edit_recording_name_hint">Ovdje unesite naziv datoteke</string> + <string name="dlg_save_recording_title">Spremi datoteku sa snimkom</string> + <string name="dlg_save_recording_storage_warning">Nedovoljno prostora za pohranu! Želite li spremiti trenutnu snimku?</string> + <string name="already_exists">već postoji</string> + <string name="optmenu_speaker">Zvučnik</string> + <string name="optmenu_earphone">Slušalica</string> + <string name="not_available">Trenutno nije dostupno</string> + <string name="add_to_favorite1">Dodaj u unaprijed zadane kanale</string> + <string name="contmenu_item_delete1">Ukloni iz unaprijed zadanih kanala</string> + <string name="dlg_delete_confirm_title1">Potvrdite uklanjanje iz unaprijed zadanih kanala</string> + <string name="dlg_delete_confirm_text1">Jeste li sigurni da želite ukloniti ovaj kanal iz unaprijed zadanih kanala?</string> + <string name="toast_favorite_full1">Ne može se dodati kanal na popis unaprijed zadanih kanala jer je on pun.</string> + <string name="toast_already_favorite1">Ovaj kanal već je na popisu unaprijed zadanih kanala.</string> + <string name="toast_channel_deleted1">Uspješno uklonjen iz unaprijed zadanih kanala.</string> + <string name="toast_channel_added1">Uspješno dodan u unaprijed zadane kanale.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-hu/strings.xml b/MediaTek/FmRadio/res/values-hu/strings.xml new file mode 100755 index 0000000..06f6794 --- /dev/null +++ b/MediaTek/FmRadio/res/values-hu/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-rádió</string> + <string name="favorite_manager">Csatornalista</string> + <string name="add_to_favorite">Hozzáadás a kedvencekhez</string> + <string name="optmenu_search">Keresés</string> + <string name="optmenu_exit">Kilépés</string> + <string name="contmenu_title">Műveletek</string> + <string name="contmenu_item_edit">Szerkesztés</string> + <string name="contmenu_item_delete">Eltávolítás a kedvencek közül</string> + <string name="dlg_noantenna_text">Fülhallgató szükséges, ami antennaként működik. Csatlakoztassa a fülhallgatót.</string> + <string name="dlg_noantenna_title">Csatlakoztassa a fülhallgatót</string> + <string name="btn_yes">Igen</string> + <string name="btn_no">Nem</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Mégse</string> + <string name="dlg_progress_title">Keresés</string> + <string name="dlg_progress_text">Csatornák keresése…</string> + <string name="dlg_addedit_station_name">Név:</string> + <string name="dlg_addedit_station_freq">Gyakoriság:</string> + <string name="dlg_addedit_title_edit">Csatorna szerkesztése</string> + <string name="default_station_name">Új csatorna</string> + <string name="dlg_delete_confirm_title">Kedvencek közüli eltávolítás megerősítése</string> + <string name="dlg_delete_confirm_text">Biztosan el akarja távolítani ezt a csatornát a kedvencek közül?</string> + <string name="toast_favorite_full">A csatorna nem adható a Kedvencekhez, mert megtelt a lista.</string> + <string name="toast_already_favorite">Ez a csatorna már a Kedvencek között van.</string> + <string name="toast_channel_deleted">Sikeresen eltávolítva a kedvencek közül.</string> + <string name="toast_channel_added">Sikeresen hozzáadva a kedvencekhez.</string> + <string name="toast_channel_searched">Talált csatornák az elérhetők közül:</string> + <string name="toast_cannot_search">Nem találhatók az elérhető csatornák közül.</string> + <string name="toast_invalid_frequency">Érvénytelen frekvencia az aktuális helyen. Érvényes frekvenciatartomány: 87,5-108,0.</string> + <string name="optmenu_rds_settings">RDS-beállítások</string> + <string name="dlg_rds_settings_channel_information">Csatornainformáció</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatív frekvencia</string> + <string name="sound_mode">Hangzásmód</string> + <string name="more">További alkalmazások</string> + <string name="power">hatvány</string> + <string name="edit_frequency_overwrite_text">"Felülírás"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Dugja be a fülhallgatót, hogy rádióantennaként használhassa.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM-rögzítő</string> + <string name="toast_recording_lost_warning">A felvétel el fog veszni az SD-kártya eltávolítása miatt!</string> + <string name="toast_start_recording">Rögzítés indítása…</string> + <string name="toast_sdcard_missing">Az SD-kártya hiányzik!</string> + <string name="toast_sdcard_insufficient_space">Nincs elegendő hely az SD-kártyán!</string> + <string name="toast_recorder_internal_error">Belső hiba történt a rögzítőn!</string> + <string name="toast_player_internal_error">Belső hiba történt a lejátszón!</string> + <string name="toast_powerup_before_record_warning">Előbb kapcsolja be az FM-rádiót!</string> + <string name="optmenu_record">FM-műsor rögzítése</string> + <string name="btn_save_recording">Mentés</string> + <string name="btn_discard_recording">Elvetés</string> + <string name="edit_recording_name_hint">Ide gépelje a fájlnevet</string> + <string name="dlg_save_recording_title">Rögzített fájl mentése</string> + <string name="dlg_save_recording_storage_warning">Nincs elegendő tárhely! Menteni akarja az aktuális felvételt?</string> + <string name="already_exists">már létezik</string> + <string name="toast_invalid_input">Érvénytelen bevitel. Érvényes: 0 v. 5.</string> + <string name="toast_in_call">Az FM-rádió hívás közben nem indítható el.</string> + <string name="empty_list">A csatornalista üres.</string> + <string name="optmenu_speaker">"Hangszóró"</string> + <string name="optmenu_earphone">Fejhallgató</string> + <string name="not_available">Jelenleg nem érhető el</string> + <string name="add_to_favorite1">Hozzáadás a beállított csatornákhoz</string> + <string name="contmenu_item_delete1">Törlés a beállított csatornák közül</string> + <string name="dlg_delete_confirm_title1">Beállított csatornák közüli eltávolítás megerősítése</string> + <string name="dlg_delete_confirm_text1">Biztosan el akarja távolítani ezt a csatornát a beállított csatornák közül?</string> + <string name="toast_favorite_full1">A csatorna nem adható a beállított csatornákhoz, mert megtelt a lista.</string> + <string name="toast_already_favorite1">Ez a csatorna már a beállított csatornák között van.</string> + <string name="toast_channel_deleted1">Sikeresen eltávolítva a beállított csatornák közül.</string> + <string name="toast_channel_added1">Sikeresen hozzáadva a beállított csatornákhoz.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-hy-rAM/strings.xml b/MediaTek/FmRadio/res/values-hy-rAM/strings.xml new file mode 100755 index 0000000..6445587 --- /dev/null +++ b/MediaTek/FmRadio/res/values-hy-rAM/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM ռադիո</string> + <string name="dlg_progress_title">Որոնել</string> + <string name="btn_yes">Այո</string> + <string name="optmenu_speaker">Բարձրախոս</string> + <string name="edit_frequency_overwrite_text">Վրագրել</string> + <string name="toast_start_recording">Սկսել ձայնագրում...</string> + <string name="fm_unit">ՄՀց</string> + <string name="empty_list">Կապուղիների ցանկը դատարկ է:</string> + <string name="optmenu_rds_settings">RDS կարգավորումներ</string> + <string name="toast_channel_searched">Որոնված մատչելի կապուղիներ`</string> + <string name="already_exists">արդեն գոյություն ունի</string> + <string name="dlg_noantenna_title">Միացնել ականջակալ</string> + <string name="add_to_favorite">Ավելացնել Ընտրյալներին</string> + <string name="toast_sdcard_insufficient_space">SD քարտում չկա բավարար տարածք:</string> + <string name="dlg_delete_confirm_title">Հաստատել ընտրյալներից հեռացումը</string> + <string name="optmenu_record">Ձայնագրել FM</string> + <string name="optmenu_earphone">Ականջակալ</string> + <string name="sound_mode">Ձայնի ռեժիմ</string> + <string name="toast_already_favorite">Այս կապուղին արդեն ընտրյալների ցանկում է:</string> + <string name="not_available">Այժմ մատչելի չէ</string> + <string name="toast_channel_deleted">Հաջողությամբ հեռացվեց ընտրյալներից:</string> + <string name="toast_channel_added">Հաջողությամբ ավելացվեց ընտրյալներին:</string> + <string name="dlg_rds_settings_channel_information">Կապուղու տեղեկություններ</string> + <string name="toast_favorite_full">Հնարավոր չէ ավելացնել կապուղին ընտրյալների ցանկին, քանի որ այն լիքն է:</string> + <string name="btn_save_recording">Պահել</string> + <string name="optmenu_search">Որոնել</string> + <string name="dlg_rds_settings_alternative_frequency">Այլընտրական հաճախականություն</string> + <string name="dlg_progress_text">Որոնել կապուղիներ...</string> + <string name="optmenu_exit">Ելնել</string> + <string name="more">Ավելին</string> + <string name="btn_discard_recording">Ջնջել</string> + <string name="contmenu_item_edit">Խմբագրել</string> + <string name="toast_cannot_search">Հնարավոր չէ որոնել մատչելի կապուղի:</string> + <string name="dlg_save_recording_storage_warning">Ոչ բավարար պահոց: Ցանկանու՞մ եք պահել այս ձայնագրությունը:</string> + <string name="toast_in_call">Չեք կարող գործարկել FM ռադիոն, քանի դեռ զանգն ընթացքի մեջ է:</string> + <string name="dlg_addedit_station_freq">Հաճախականություն`</string> + <string name="toast_recorder_internal_error">Տեղի ունեցավ ձայնագրիչի ներքին սխալ:</string> + <string name="dlg_save_recording_title">Պահել ձայնագրության ֆայլը</string> + <string name="btn_ok">Լավ</string> + <string name="power">Հոսանք</string> + <string name="contmenu_item_delete">Հանել ընտրյալներից</string> + <string name="toast_powerup_before_record_warning">Նախ միացրեք FM-ը:</string> + <string name="fm_recorder_name">FM ձայնագրիչ</string> + <string name="toast_recording_lost_warning">Ձեր ձայնագրությունը կկորչի SD-ն հանելու պատճառով:</string> + <string name="dlg_delete_confirm_text">Համոզվա՞ծ եք, որ ցանկանում եք հեռացնել այս կապուղին ընտրյալներից:</string> + <string name="default_station_name">Նոր կապուղի</string> + <string name="btn_cancel">Չեղարկել</string> + <string name="contmenu_title">Գործողություններ</string> + <string name="btn_no">Ոչ</string> + <string name="favorite_manager">Կապուղիների ցանկ</string> + <string name="toast_invalid_frequency">Ներկա տեղադրության համար անհասանելի հաճախականություն: Հասանելի հաճախականության տիրույթ` 87.5-108.0</string> + <string name="toast_sdcard_missing">Ձեր SD քարտն առկա չէ:</string> + <string name="dlg_addedit_station_name">Անվանում`</string> + <string name="dlg_addedit_title_edit">Խմբագրել կապուղին</string> + <string name="toast_invalid_input">Վերջին անվավեր ներմուծումը, վավեր արժեք` 0-ից 5:</string> + <string name="edit_recording_name_hint">Մուտքագրել ֆայլի անվանումն այստեղ</string> + <string name="dlg_noantenna_text">Անհրաժեշտ է ականջակալ` որպես ալեհավաք: Միացրեք ականջակալը:</string> + <string name="toast_player_internal_error">Տեղի ունեցավ նվագարկիչի ներքին սխալ:</string> + <string name="no_antenna_info">Միացրեք ականջակալները` որպես ռադիոյի ալեհավաք օգտագործելու համար:</string> + <string name="add_to_favorite1">Հավելել նախակայված ալիքներին</string> + <string name="contmenu_item_delete1">Հեռացնել նախակայված ալիքներից</string> + <string name="dlg_delete_confirm_title1">Հաստատել նախակայվածներից հեռացումը</string> + <string name="dlg_delete_confirm_text1">Դուք վստա՞հ եք, որ ցանկանում եք հեռացնել այս ալիքը նախակայված ալիքներից:</string> + <string name="toast_favorite_full1">Հնարավոր չէ հավելել ալիքը նախակայված ալիքների ցուցակին, քանի որ այն լցված է:</string> + <string name="toast_already_favorite1">Այս ալիքն արդեն գտնվում է նախակայված ալիքների ցուցակում:</string> + <string name="toast_channel_deleted1">Հաջող հեռացվեց նախակայված ալիքների ցուցակից:</string> + <string name="toast_channel_added1">Հաջող հավելվեց նախակայված ալիքների ցուցակին:</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-in/strings.xml b/MediaTek/FmRadio/res/values-in/strings.xml new file mode 100755 index 0000000..cb5d281 --- /dev/null +++ b/MediaTek/FmRadio/res/values-in/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Radio FM</string> + <string name="favorite_manager">Daftar saluran</string> + <string name="add_to_favorite">Tambahkan ke Favorit</string> + <string name="optmenu_search">Cari</string> + <string name="optmenu_exit">Keluar</string> + <string name="contmenu_title">Operasi</string> + <string name="contmenu_item_edit">Edit</string> + <string name="contmenu_item_delete">Hapus dari favorit</string> + <string name="dlg_noantenna_text">Anda memerlukan earphone sebagai antena. Pasang earphone.</string> + <string name="dlg_noantenna_title">Pasang earphone?</string> + <string name="btn_yes">Ya</string> + <string name="btn_no">Tidak</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Batal</string> + <string name="dlg_progress_title">Pindai</string> + <string name="dlg_progress_text">Pindai saluran…</string> + <string name="dlg_addedit_station_name">Nama:</string> + <string name="dlg_addedit_station_freq">Frekuensi:</string> + <string name="dlg_addedit_title_edit">Edit Saluran</string> + <string name="default_station_name">Saluran Baru</string> + <string name="dlg_delete_confirm_title">Konfirmasikan Penghapusan Saluran</string> + <string name="dlg_delete_confirm_text">Anda yakin ingin menghapus saluran ini?</string> + <string name="toast_favorite_full">Tidak dapat menambahkan saluran ke daftar favorit karena penuh.</string> + <string name="toast_already_favorite">Saluran ini sudah ada di daftar favorit.</string> + <string name="toast_channel_deleted">Berhasil dihapus dari favorit.</string> + <string name="toast_channel_added">Berhasil ditambahkan ke favorit.</string> + <string name="toast_channel_searched">Saluran tersedia yang dicari:</string> + <string name="toast_cannot_search">Tidak dapat mencari saluran yang tersedia.</string> + <string name="optmenu_rds_settings">Pengaturan RDS</string> + <string name="dlg_rds_settings_channel_information">Informasi saluran</string> + <string name="dlg_rds_settings_alternative_frequency">Frekuensi alternatif</string> + <string name="more">Aplikasi Lain</string> + <string name="power">Power</string> + <string name="sound_mode">Mode Suara</string> + <string name="edit_frequency_overwrite_text">"Timpa"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Pasang earphone untuk digunakan sebagai antena radio.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">Perekam FM</string> + <string name="toast_recording_lost_warning">Perekaman Anda akan hilang karena penghapusan SD!</string> + <string name="toast_start_recording">Mulai merekam…</string> + <string name="toast_sdcard_missing">Kartu SD Anda tidak ada!</string> + <string name="toast_sdcard_insufficient_space">Kapasitas kartu SD tidak memadai!</string> + <string name="toast_recorder_internal_error">Terjadi kesalahan internal pada perekam!</string> + <string name="toast_player_internal_error">Terjadi kesalahan internal pada pemutar!</string> + <string name="toast_powerup_before_record_warning">Aktifkan FM terlebih dulu!</string> + <string name="optmenu_record">Rekam FM</string> + <string name="btn_save_recording">Simpan</string> + <string name="btn_discard_recording">Hapus</string> + <string name="edit_recording_name_hint">Ketik nama file di sini</string> + <string name="dlg_save_recording_title">Simpan file perekaman</string> + <string name="dlg_save_recording_storage_warning">Kapasitas penyimpanan tidak memadai! Anda ingin menyimpan perekaman saat ini?</string> + <string name="already_exists">Sudah ada</string> + <string name="toast_invalid_frequency">Frekuensi tidak valid untuk lokasi saat ini. Rentang frekuensi yang valid: 87,5-10,0.</string> + <string name="toast_invalid_input">Input terakhir tidak valid, nilai valid adalah 0 atau 5.</string> + <string name="toast_in_call">Anda tidak dapat mengaktifkan Radio FM saat menangani panggilan.</string> + <string name="empty_list">Daftar saluran kosong.</string> + <string name="optmenu_speaker">"Speaker"</string> + <string name="optmenu_earphone">Headset</string> + <string name="not_available">Tidak tersedia saat ini</string> + <string name="add_to_favorite1">Tambahkan ke daftar saluran standar</string> + <string name="contmenu_item_delete1">Hapus dari daftar saluran standar</string> + <string name="dlg_delete_confirm_title1">Konfirmasikan penghapusan dari daftar saluran standar</string> + <string name="dlg_delete_confirm_text1">Anda yakin ingin menghapus saluran ini dari daftar saluran standar?</string> + <string name="toast_favorite_full1">Tidak dapat menambahkan saluran ke daftar saluran standar karena sudah penuh.</string> + <string name="toast_already_favorite1">Saluran ini sudah ada dalam daftar saluran standar.</string> + <string name="toast_channel_deleted1">Berhasil dihapus dari saluran standar.</string> + <string name="toast_channel_added1">Berhasil ditambahkan ke saluran standar.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-it/strings.xml b/MediaTek/FmRadio/res/values-it/strings.xml new file mode 100755 index 0000000..abf9952 --- /dev/null +++ b/MediaTek/FmRadio/res/values-it/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">"Radio FM"</string> + <string name="favorite_manager">Elenco canali</string> + <string name="add_to_favorite">Aggiungi a preferiti</string> + <string name="optmenu_search">Ricerca</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">Operazioni</string> + <string name="contmenu_item_edit">Modifica</string> + <string name="contmenu_item_delete">Rimuovi dai preferiti</string> + <string name="dlg_noantenna_text">È necessario usare le cuffie come antenna. Collegare le cuffie.</string> + <string name="dlg_noantenna_title">Collegare le cuffie</string> + <string name="btn_yes">Sì</string> + <string name="btn_no">No</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Annulla</string> + <string name="dlg_progress_title">Scansione</string> + <string name="dlg_progress_text">Cerca canali...</string> + <string name="dlg_addedit_station_name">Nome:</string> + <string name="dlg_addedit_station_freq">Frequenza:</string> + <string name="dlg_addedit_title_edit">Modifica canale</string> + <string name="default_station_name">Nuovo canale</string> + <string name="dlg_delete_confirm_title">Conferma Elimina canale</string> + <string name="dlg_delete_confirm_text">Si è certi di volere eliminare questo canale?</string> + <string name="toast_favorite_full">Impossibile aggiungere il canale all’elenco dei preferiti perché è pieno.</string> + <string name="toast_already_favorite">Questo canale è già nell’elenco dei preferiti.</string> + <string name="toast_channel_deleted">Rimozione dai preferiti riuscita.</string> + <string name="toast_channel_added">Aggiunta ai preferiti riuscita.</string> + <string name="toast_channel_searched">Canali disponibili ricercati:</string> + <string name="toast_cannot_search">Impossibile ricercare i canali disponibili</string> + <string name="optmenu_rds_settings">Impostazioni RDS</string> + <string name="dlg_rds_settings_channel_information">Informazioni canale</string> + <string name="dlg_rds_settings_alternative_frequency">Frequenza alternativa</string> + <string name="more">Altra applicazione</string> + <string name="power">potenza</string> + <string name="sound_mode">Modalità audio</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Collegare le cuffie da utilizzare come antenna radio. </string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Sostituisci"</string> + <string name="fm_recorder_name">Registratore FM</string> + <string name="toast_recording_lost_warning">La registrazione andrà persa per la rimozione della scheda SD!</string> + <string name="toast_start_recording">Avvio registrazione…</string> + <string name="toast_sdcard_missing">Scheda SD mancante!</string> + <string name="toast_sdcard_insufficient_space">Spazio su scheda SD insufficiente!</string> + <string name="toast_recorder_internal_error">Errore interno nel registratore!</string> + <string name="toast_player_internal_error">Errore interno nel lettore!</string> + <string name="toast_powerup_before_record_warning">Prima accendere FM!</string> + <string name="optmenu_record">Registra FM</string> + <string name="btn_save_recording">Salva</string> + <string name="btn_discard_recording">Ignora</string> + <string name="edit_recording_name_hint">Digita qui nome file</string> + <string name="dlg_save_recording_title">Salva registrazione file</string> + <string name="dlg_save_recording_storage_warning">Memoria insufficiente! Salvare registrazione attuale?</string> + <string name="already_exists">Già presente</string> + <string name="toast_invalid_frequency">Frequenza non valida per posizione attuale. Gamma frequenza valida: 87,5-108,0.</string> + <string name="toast_invalid_input">Ultimo input non valido. Valore valido 0 o 5.</string> + <string name="toast_in_call">Non è possibile avviare la radio FM durante una chiamata.</string> + <string name="empty_list">L’elenco dei canali è vuoto.</string> + <string name="optmenu_speaker">"Altoparlante"</string> + <string name="optmenu_earphone">Cuffie</string> + <string name="not_available">Al momento non disponibile</string> + <string name="add_to_favorite1">Aggiungi a canali preselezionati</string> + <string name="contmenu_item_delete1">Rimuovi da canali preselezionati</string> + <string name="dlg_delete_confirm_title1">Conferma rimozione da canali preselezionati</string> + <string name="dlg_delete_confirm_text1">Rimuovere questo canale dai canali preselezionati?</string> + <string name="toast_favorite_full1">"Impossibile aggiungere il canale all'elenco dei canali preselezionati in quanto è pieno."</string> + <string name="toast_already_favorite1">"Canale già presente nell'elenco dei canali preselezionati."</string> + <string name="toast_channel_deleted1">Rimozione da canali preselezionati riuscita.</string> + <string name="toast_channel_added1">Aggiunta a canali preselezionati riuscita.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-iw/strings.xml b/MediaTek/FmRadio/res/values-iw/strings.xml new file mode 100755 index 0000000..5780a51 --- /dev/null +++ b/MediaTek/FmRadio/res/values-iw/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">רדיו FM</string> + <string name="favorite_manager">רשימת תחנות</string> + <string name="add_to_favorite">הוסף למועדפים</string> + <string name="optmenu_search">חיפוש</string> + <string name="optmenu_exit">יציאה</string> + <string name="contmenu_title">פעולות</string> + <string name="contmenu_item_edit">עריכה</string> + <string name="contmenu_item_delete">הסר מהמועדפים</string> + <string name="dlg_noantenna_text">אתה זקוק לאוזניות בתור אנטנה. חבר את האוזניות.</string> + <string name="dlg_noantenna_title">חבר את האזניות</string> + <string name="btn_yes">כן</string> + <string name="btn_no">לא</string> + <string name="btn_ok">אישור</string> + <string name="btn_cancel">ביטול</string> + <string name="dlg_progress_title">חיפוש</string> + <string name="dlg_progress_text">חיפוש תחנות...</string> + <string name="dlg_addedit_station_name">שם:</string> + <string name="dlg_addedit_station_freq">תדר:</string> + <string name="dlg_addedit_title_edit">ערוך תחנה</string> + <string name="default_station_name">תחנה חדשה</string> + <string name="dlg_delete_confirm_title">אשר הסרה מהמועדפים</string> + <string name="dlg_delete_confirm_text">האם אתה בטוח שברצונך להסיר תחנה זו מהמועדפים?</string> + <string name="toast_favorite_full">לא ניתן להוסיף את התחנה לרשימת המועדפים מכיוון שהיא מלאה.</string> + <string name="toast_already_favorite">התחנה נמצאת כבר ברשימת המועדפים.</string> + <string name="toast_channel_deleted">הוסרה בהצלחה מהמועדפים.</string> + <string name="toast_channel_added">הוספה בהצלחה למועדפים.</string> + <string name="toast_channel_searched">חיפש תחנות זמינות:</string> + <string name="toast_cannot_search">לא ניתן לחפש תחנה זמינה.</string> + <string name="toast_invalid_frequency">תדר לא חוקי למיקום הנוכחי. טווח התדרים החוקי: 87.5 - 108.0</string> + <string name="toast_invalid_input">הזנה לא חוקית, ערך חוקי הוא 0 או 5.</string> + <string name="optmenu_rds_settings">הגדרות RDS</string> + <string name="dlg_rds_settings_channel_information">פרטי תחנה</string> + <string name="dlg_rds_settings_alternative_frequency">תדר חלופי</string> + <string name="sound_mode">מצב צליל</string> + <string name="more">עוד</string> + <string name="power">בחזקת</string> + <string name="edit_frequency_overwrite_text">"החלף"</string> + <string name="fm_unit">מגה הרץ</string> + <string name="no_antenna_info">הרכב את האוזניות לשימוש כאנטנת רדיו.</string> + <string name="fm_recorder_name">מקליט FM</string> + <string name="toast_recording_lost_warning">ההקלטה תאבד בשל הסרת כרטיס ה-SD!</string> + <string name="toast_start_recording">התחל בהקלטה...</string> + <string name="toast_sdcard_missing">כרטיס ה-SD חסר!</string> + <string name="toast_sdcard_insufficient_space">אין מספיק מקום בכרטיס ה-SD!</string> + <string name="toast_recorder_internal_error">אירעה שגיאה פנימית במקליט!</string> + <string name="toast_player_internal_error">אירעה שגיאה פנימית בנגן!</string> + <string name="toast_powerup_before_record_warning">הפעל תחילה את ה-FM!</string> + <string name="optmenu_record">הקלט FM</string> + <string name="btn_save_recording">שמור</string> + <string name="btn_discard_recording">מחק</string> + <string name="edit_recording_name_hint">הקלד שם קובץ כאן</string> + <string name="dlg_save_recording_title">שמור קובץ הקלטה</string> + <string name="dlg_save_recording_storage_warning">שטח אחסון לא מספיק! האם ברצונך לשמור את ההקלטה הנוכחית?</string> + <string name="already_exists">כבר קיים</string> + <string name="toast_in_call">לא ניתן להפעיל רדיו FM בעת שיחה.</string> + <string name="empty_list">רשימת התחנות ריקה.</string> + <string name="optmenu_speaker">"רמקול"</string> + <string name="optmenu_earphone">אזניות</string> + <string name="not_available">לא זמין כעת</string> + <string name="add_to_favorite1">הוסף לתחנות שמורות</string> + <string name="contmenu_item_delete1">הסר מהתחנות השמורות</string> + <string name="dlg_delete_confirm_title1">אשר הסרה מהתחנות השמורות</string> + <string name="dlg_delete_confirm_text1">האם אתה בטוח שברצונך להסיר תחנה זו מהתחנות השמורות?</string> + <string name="toast_favorite_full1">לא ניתן להוסיף את התחנה לרשימת התחנות השמורות מכיוון שהיא מלאה.</string> + <string name="toast_already_favorite1">התחנה נמצאת כבר ברשימת התחנות השמורות.</string> + <string name="toast_channel_deleted1">הוסרה בהצלחה מהתחנות השמורות.</string> + <string name="toast_channel_added1">הוספה בהצלחה לתחנות השמורות.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-ja/strings.xml b/MediaTek/FmRadio/res/values-ja/strings.xml new file mode 100755 index 0000000..bca98aa --- /dev/null +++ b/MediaTek/FmRadio/res/values-ja/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FMラジオ</string> + <string name="dlg_progress_title">検索</string> + <string name="btn_yes">はい</string> + <string name="optmenu_speaker">スピーカー</string> + <string name="edit_frequency_overwrite_text">上書き</string> + <string name="toast_start_recording">録音開始...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">チャンネルリストは空です。</string> + <string name="optmenu_rds_settings">RDS設定</string> + <string name="toast_channel_searched">利用可能なチャンネルを検索:</string> + <string name="already_exists">すでに存在しています</string> + <string name="dlg_noantenna_title">イヤホンの差し込み</string> + <string name="add_to_favorite">お気に入りに追加</string> + <string name="toast_sdcard_insufficient_space">SDカード容量が不足しています!</string> + <string name="dlg_delete_confirm_title">お気に入りからの削除を確認</string> + <string name="optmenu_record">FMを録音</string> + <string name="optmenu_earphone">イヤホン</string> + <string name="sound_mode">サウンドモード</string> + <string name="toast_already_favorite">このチャンネルはすでにお気に入りリストの中にあります。</string> + <string name="not_available">現在使用できません</string> + <string name="toast_channel_deleted">お気に入りから削除されました。</string> + <string name="toast_channel_added">お気に入りに追加されました。</string> + <string name="dlg_rds_settings_channel_information">チャンネル情報</string> + <string name="toast_favorite_full">満杯のため、お気に入りリストにチャンネルを追加できません。</string> + <string name="btn_save_recording">保存</string> + <string name="optmenu_search">検索</string> + <string name="dlg_rds_settings_alternative_frequency">代替周波数</string> + <string name="dlg_progress_text">チャンネルの検索...</string> + <string name="optmenu_exit">終了</string> + <string name="more">詳細</string> + <string name="btn_discard_recording">捨てる</string> + <string name="contmenu_item_edit">編集</string> + <string name="toast_cannot_search">利用可能なチャンネルを検索できません。</string> + <string name="dlg_save_recording_storage_warning">容量が不足しています!現在の録音を保存しますか?</string> + <string name="toast_in_call">通話中にFMラジオは起動できません。</string> + <string name="dlg_addedit_station_freq">周波数:</string> + <string name="toast_recorder_internal_error">レコーダーで内部エラーが発生しました!</string> + <string name="dlg_save_recording_title">録音ファイルを保存</string> + <string name="btn_ok">OK</string> + <string name="power">電源</string> + <string name="contmenu_item_delete">お気に入りから削除</string> + <string name="toast_powerup_before_record_warning">最初にFMの電源を入れてください!</string> + <string name="fm_recorder_name">FMレコーダー</string> + <string name="toast_recording_lost_warning">SDが取り出されたため、録音は失われます!</string> + <string name="dlg_delete_confirm_text">お気に入りからこのチャンネルを削除してもよろしいですか?</string> + <string name="default_station_name">新しいチャンネル</string> + <string name="btn_cancel">キャンセル</string> + <string name="contmenu_title">操作</string> + <string name="btn_no">いいえ</string> + <string name="favorite_manager">チャンネルリスト</string> + <string name="toast_invalid_frequency">現在の場所では無効な周波数です。有効な周波数範囲:87.5-108.0</string> + <string name="toast_sdcard_missing">SDカードがありません!</string> + <string name="dlg_addedit_station_name">名前:</string> + <string name="dlg_addedit_title_edit">チャンネルの編集</string> + <string name="toast_invalid_input">最後の入力は無効です。有効な値は0または5です。</string> + <string name="edit_recording_name_hint">ここにファイル名を入力します</string> + <string name="dlg_noantenna_text">アンテナとしてイヤホンが必要です。イヤホンを差し込んでください。</string> + <string name="toast_player_internal_error">プレイヤーで内部エラーが発生しました!</string> + <string name="no_antenna_info">イヤホンを差し込み、ラジオのアンテナとして使用します。</string> + <string name="add_to_favorite1">プリセットチャンネルに追加する</string> + <string name="contmenu_item_delete1">プリセットチャンネルから外す</string> + <string name="dlg_delete_confirm_title1">プリセットチャンネルからの削除を確定する</string> + <string name="dlg_delete_confirm_text1">このチャンネルをプリセットから削除しますか?</string> + <string name="toast_favorite_full1">プリセットが一杯なので、チャンネルを追加できません。</string> + <string name="toast_already_favorite1">このチャンネルは既にプリセットに登録されています。</string> + <string name="toast_channel_deleted1">プリセットチャンネルから削除しました。</string> + <string name="toast_channel_added1">プリセットチャンネルに登録しました。</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-ka-rGE/strings.xml b/MediaTek/FmRadio/res/values-ka-rGE/strings.xml new file mode 100755 index 0000000..6b9e9f4 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ka-rGE/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM რადიო</string> + <string name="dlg_progress_title">ძებნა</string> + <string name="btn_yes">კი</string> + <string name="optmenu_speaker">დინამიკი</string> + <string name="edit_frequency_overwrite_text">გადაწერა</string> + <string name="toast_start_recording">ჩაწერის დაწყება...</string> + <string name="fm_unit">მჰც</string> + <string name="empty_list">არხების სია ცარიელია.</string> + <string name="optmenu_rds_settings">RDS პარამეტრები</string> + <string name="toast_channel_searched">ხელმისაწვდომი არხების ძებნა დასრულებულია:</string> + <string name="already_exists">უკვე არსებობს</string> + <string name="dlg_noantenna_title">ჩართეთ ყურსასმენები</string> + <string name="add_to_favorite">ფავორიტებში დამატება</string> + <string name="toast_sdcard_insufficient_space">არასაკმარისი SD ბარათის მოცულობა!</string> + <string name="dlg_delete_confirm_title">დაადასტურეთ წაშლა ფავორიტებიდან</string> + <string name="optmenu_record">Record FM</string> + <string name="optmenu_earphone">ყურსასმენები</string> + <string name="sound_mode">ხმის რეჟიმი</string> + <string name="toast_already_favorite">ეს არხი უკვე ფავორიტების სიაში.</string> + <string name="not_available">ამჟამად არ არის ხელმისაწვდომი</string> + <string name="toast_channel_deleted">წარმატებით წაშლილია ფავორიტებიდან.</string> + <string name="toast_channel_added">წარმატებით დამატებულია ფავორიტებში.</string> + <string name="dlg_rds_settings_channel_information">ინფორმაცია არხზე</string> + <string name="toast_favorite_full">ახრის დამატება ფავორიტების სიაში ვერ მოხერხდა, რადგან ის სავსეა.</string> + <string name="btn_save_recording">დამახსოვრება</string> + <string name="optmenu_search">ძებნა</string> + <string name="dlg_rds_settings_alternative_frequency">ალტერნატიული სიხშირე</string> + <string name="dlg_progress_text">არხების ძებნა...</string> + <string name="optmenu_exit">გამოსვლა</string> + <string name="more">კიდევ</string> + <string name="btn_discard_recording">გაუქმება</string> + <string name="contmenu_item_edit">რედაქტირება</string> + <string name="toast_cannot_search">ხელმისაწვდომი არხი ვერ მოიძებნა.</string> + <string name="dlg_save_recording_storage_warning">შენახვის ადგილი არასაკმარისია! გსურთ შეინახოთ მიმდინარე ჩანაწერი?</string> + <string name="toast_in_call">თქვენ ვერ ჩართავთ FM რადიოს ზარის განხორციელების დროს.</string> + <string name="dlg_addedit_station_freq">სიხშირე:</string> + <string name="toast_recorder_internal_error">შიდა შეცდომა ჩამწერში!</string> + <string name="dlg_save_recording_title">ჩაწერილი ფაილის დამახსოვრება</string> + <string name="btn_ok">OK</string> + <string name="power">ჩართვა</string> + <string name="contmenu_item_delete">წაშლა ფავორიტებიდან</string> + <string name="toast_powerup_before_record_warning">გთხოვთ პირველ რიგში ჩართოთ FM!</string> + <string name="fm_recorder_name">FM ჩამწერი</string> + <string name="toast_recording_lost_warning">თქვენი ჩანაწერი დაიკარგება SD ამოღების შემთხვევაში!</string> + <string name="dlg_delete_confirm_text">დარწმუნებული ხართ, რომ გსურთ ამ არხის წაშლა ფავორიტებიდან?</string> + <string name="default_station_name">ახალი არხი</string> + <string name="btn_cancel">გაუქმება</string> + <string name="contmenu_title">ოპერაციები</string> + <string name="btn_no">არა</string> + <string name="favorite_manager">არხების სია</string> + <string name="toast_invalid_frequency">არასწორი სიხშირე მიმდინარე ადგილსთვის. ძალაშია სიხშირის ფარგლებში: 87.5-108.0</string> + <string name="toast_sdcard_missing">თქვენი SD ბარათი არ არის დაყენებული!</string> + <string name="dlg_addedit_station_name">დასახელება:</string> + <string name="dlg_addedit_title_edit">არხის რედაქტირება</string> + <string name="toast_invalid_input">ბოლო არასწორად შეყვანილი მნიშვნელობა, სწორი მნიშვნელობა არის 0 ან 5.</string> + <string name="edit_recording_name_hint">აქრიფეთ აქ ფაილის დასახელება</string> + <string name="dlg_noantenna_text">თქვენ გჭირდებათ ყურსასმენები ანტენის სახით. გთხოვთ ჩართოთ თქვენს ყურსასმენები.</string> + <string name="toast_player_internal_error">შიდა შეცდომა ფლეერში!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-kk/strings.xml b/MediaTek/FmRadio/res/values-kk/strings.xml new file mode 100755 index 0000000..1b189e5 --- /dev/null +++ b/MediaTek/FmRadio/res/values-kk/strings.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">FM радио</string> + <string name="favorite_manager">Арна тізімі</string> + <string name="add_to_favorite">Сүйіктілерге қосу</string> + <string name="add_to_favorite1">Алдын ала орнатылған арналарға қосу</string> + <string name="optmenu_search">Іздеу</string> + <string name="optmenu_exit">Шығу</string> + <string name="contmenu_title">Әрекеттер</string> + <string name="contmenu_item_edit">Өңдеу</string> + <string name="contmenu_item_delete">Таңдаулылар қатарынан өшіру</string> + <string name="contmenu_item_delete1">Алдын ала орнатылған арналардан жою</string> + <string name="dlg_noantenna_text">Антенна ретінде құлаққап қажет. Құлаққабыңызды жалғаңыз.</string> + <string name="dlg_noantenna_title">Құлаққабыңызды жалғаңыз</string> + <string name="btn_yes">Иә</string> + <string name="btn_no">Жоқ</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Болдырмау</string> + <string name="dlg_progress_title">Іздеу</string> + <string name="dlg_progress_text">Арналарды іздеу...</string> + <string name="dlg_addedit_station_name">Атауы:</string> + <string name="dlg_addedit_station_freq">Жиілігі:</string> + <string name="dlg_addedit_title_edit">Арнаны өңдеу</string> + <string name="default_station_name">Жаңа арна</string> + <string name="dlg_delete_confirm_title">Сүйіктілерден жоюды растау</string> + <string name="dlg_delete_confirm_title1">Алдын ала орнатылған арналар тізімінен жоюды растау</string> + <string name="dlg_delete_confirm_text">Бұл арнаны сүйіктілерден жою қажет пе?</string> + <string name="dlg_delete_confirm_text1">Бұл арнаны алдын ала орнатылған арналар тізімінен жою қажет пе?</string> + <string name="toast_favorite_full">Арнаны сүйіктілер тізіміне қосу мүмкін емес, тізім толып кетті.</string> + <string name="toast_favorite_full1">Арнаны алдын ала орнатылған арналар тізіміне қосу мүмкін емес, тізім толып кетті.</string> + <string name="toast_already_favorite">Бұл арна бұрыннан сүйіктілер тізімінде.</string> + <string name="toast_already_favorite1">Бұл арна бұрыннан алдын ала орнатылған арналар тізімінде.</string> + <string name="toast_channel_deleted">Сүйіктілер тізімінен сәтті жойылды.</string> + <string name="toast_channel_deleted1">Алдын ала орнатылған арналар тізімінен сәтті жойылды.</string> + <string name="toast_channel_added">Сүйіктілер тізіміне сәтті қосылды.</string> + <string name="toast_channel_added1">Алдын ала орнатылған арналар тізіміне сәтті қосылды.</string> + <string name="toast_channel_searched">Табылған қолжетімді арналар:</string> + <string name="toast_cannot_search">Қолжетімді арнаны табу мүмкін емес.</string> + <string name="toast_invalid_frequency">Ағымдағы орын үшін жарамсыз жиіліг. Жарамды жиілік ауқымы: 87,5-108,0</string> + <string name="toast_invalid_input">Соңғы жарамсыз енгізілім, жарамды мән 0 немесе 5.</string> + <string name="optmenu_rds_settings">RDS параметрлері</string> + <string name="dlg_rds_settings_channel_information">Арна ақпараты</string> + <string name="dlg_rds_settings_alternative_frequency">Балама жиілік</string> + <string name="sound_mode">Дыбыс режимі</string> + <string name="more">Қосымша параметрлер</string> + <string name="power">Қуат</string> + <string name="toast_in_call">Қоңырау кезінде FM радионы қосу мүмкін емес.</string> + <string name="empty_list">Арналар тізімі бос.</string> + <string name="edit_frequency_overwrite_text">Қайта жазу</string> + <string name="fm_unit">МГц</string> + <string name="no_antenna_info">Құлаққабыңызды жалғаңыз</string> + <string name="fm_recorder_name">FM жазу құрылғысы</string> + <string name="toast_recording_lost_warning">Жазба SD картасының шығарылуына байланысты жоғалады!</string> + <string name="toast_start_recording">Жазуды іске қосу...</string> + <string name="toast_sdcard_missing">SD картасы жоқ!</string> + <string name="toast_sdcard_insufficient_space">SD картасында бос орын жоқ!</string> + <string name="toast_recorder_internal_error">Жазу құралында ішкі қате орын алды!</string> + <string name="toast_player_internal_error">Ойнатқышта ішкі қате орын алды!</string> + <string name="toast_powerup_before_record_warning">Алдымен FM қабылдағышын қосыңыз!</string> + <string name="optmenu_record">FM жазу</string> + <string name="btn_save_recording">Сақтау</string> + <string name="btn_discard_recording">Жою</string> + <string name="edit_recording_name_hint">Файл атауын мұнда енгізіңіз</string> + <string name="dlg_save_recording_title">Жазылған файлды сақтау</string> + <string name="dlg_save_recording_storage_warning">Бос орын жеткіліксіз! Ағымдағы жазуды сақтау қажет пе?</string> + <string name="already_exists">бұрыннан бар</string> + <string name="optmenu_speaker">Динамик</string> + <string name="optmenu_earphone">Құлаққап</string> + <string name="not_available">Ағымдағы уақытта қолжетімсіз</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-km-rKH/strings.xml b/MediaTek/FmRadio/res/values-km-rKH/strings.xml new file mode 100755 index 0000000..af446c1 --- /dev/null +++ b/MediaTek/FmRadio/res/values-km-rKH/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">វិទ្យុ FM</string> + <string name="favorite_manager">បញ្ជីប៉ុស្ត៍វិទ្យុ</string> + <string name="add_to_favorite">បន្ថែមទៅក្នុងបញ្ជីចំណូលចិត្ត</string> + <string name="optmenu_search">រាវរក</string> + <string name="optmenu_exit">ចាកចេញ</string> + <string name="contmenu_title">ប្រតិបត្តិការ</string> + <string name="contmenu_item_edit">កែសម្រួល</string> + <string name="contmenu_item_delete">លុបចេញពីបញ្ជីចំណូលចិត្ត</string> + <string name="dlg_noantenna_text">អ្នកត្រូវការកាសស្តាប់ត្រចៀកធ្វើជាអង់តែន ។ សូមស៊កបញ្ចូលកាសស្តាប់ត្រចៀករបស់អ្នក ។</string> + <string name="dlg_noantenna_title">ស៊កឧបករណ៍ស្តាប់ត្រចៀកចូល</string> + <string name="btn_yes">បាទ</string> + <string name="btn_no">ទេ</string> + <string name="btn_ok">យល់ព្រម</string> + <string name="btn_cancel">លើកលែង</string> + <string name="dlg_progress_title">រាវរក</string> + <string name="dlg_progress_text">រាវរកប៉ុស្តិ៍ ...</string> + <string name="dlg_addedit_station_name">ឈ្មោះ ៖</string> + <string name="dlg_addedit_station_freq">ហ្វេ្រកង់ ៖</string> + <string name="dlg_addedit_title_edit">កែសម្រួលប៉ុស្តិ៍</string> + <string name="default_station_name">ប៉ុស្តិ៍ថ្មី</string> + <string name="dlg_delete_confirm_title">បញ្ជាក់ការលុបចោលពីបញ្ជីចំណូលចិត្ត</string> + <string name="dlg_delete_confirm_text">តើប្រាកដទេថាអ្នកចង់លុបប៉ុស្តិ៍នេះចោលពីបញ្ជីចំណូលចិត្ត?</string> + <string name="toast_favorite_full">មិនអាចបន្ថែមប៉ុស្តិ៍ទៅក្នុងបញ្ជីចំណូលចិត្ត ដោយសាវាពេញហើយ ។</string> + <string name="toast_already_favorite">ប៉ុស្តិ៍នេះស្ថិតនៅក្នុងបញ្ជីចំណូលចិត្តរួចហើយ ។</string> + <string name="toast_channel_deleted">បានលុបចោលពីបញ្ជីចំណូលចិត្តដោយជោគជ័យ ។</string> + <string name="toast_channel_added">បានបន្ថែមទៅក្នុងបញ្ជីចំណូលចិត្តដោយជោគជ័យ ។</string> + <string name="toast_channel_searched">រាវរកប៉ុស្តិ៍ផ្សេងៗដែលមាន ៖</string> + <string name="toast_cannot_search">មិនអាចរាវរកប៉ុស្តិ៍ដែលមានបានឡើយ ។</string> + <string name="toast_invalid_frequency">ហ្វ្រេកង់គ្មានសុពលភាពសម្រាប់ទីតាំងបច្ចុប្បន្ន ។ វិសាលភាពនៃហ្វ្រេកង់ដែលមានសុពលភាព ៖ 87.5-108.0</string> + <string name="toast_invalid_input">បញ្ចូលតម្លៃដែលគ្មានសុពលភាព ។ តម្លៃដែលមានសុពលភាពគឺ 0 ឬ 5 ។</string> + <string name="optmenu_rds_settings">ការសិត RDS</string> + <string name="dlg_rds_settings_channel_information">ព័ត៌មានប៉ុស្តិ៍</string> + <string name="dlg_rds_settings_alternative_frequency">ហ្វ្រេកង់ផ្សេងទៀត</string> + <string name="sound_mode">ម៉ូដសម្លេង</string> + <string name="more">បន្ថែមទៀត</string> + <string name="power">ស្វ័យគុណ</string> + <string name="edit_frequency_overwrite_text">សរសេរពីលើ</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">ដោតកាសស្ដាប់អ្នកដើម្បីប្រើជាអង់តែនវិទ្យុ។</string> + <string name="fm_recorder_name">ឧបករណ៍ថតសម្លេង FM</string> + <string name="toast_recording_lost_warning">ការថតសម្លេងរបស់អ្នកនឹងត្រូវបាត់បង់ ដោយសារអ្នកបានដក SD ចេញ!</string> + <string name="toast_start_recording">ចាប់ផ្តើមការថតសម្លេង ...</string> + <string name="toast_sdcard_missing">កាត SD របស់អ្នកបានបាត់!</string> + <string name="toast_sdcard_insufficient_space">កន្លែងនៅក្នុងកាត SD មិនគ្រប់គ្រាន់!</string> + <string name="toast_recorder_internal_error">កំហុសខាងក្នុងបានកើតឡើង នៅក្នុងឧបករណ៍ថតសម្លេង!</string> + <string name="toast_player_internal_error">កំហុសខាងក្នុងបានកើតឡើង នៅក្នុងឧបករណ៍ចាក់សម្លេង!</string> + <string name="toast_powerup_before_record_warning">សូមបើក FM ជាមុនសិន!</string> + <string name="optmenu_record">ថតសម្លេង FM</string> + <string name="btn_save_recording">រក្សាទុក</string> + <string name="btn_discard_recording">បោះចោល</string> + <string name="edit_recording_name_hint">វាយឈ្មោះឯកសារនៅទីនេះ</string> + <string name="dlg_save_recording_title">រក្សាទុកឯកសារដែលបានថត</string> + <string name="dlg_save_recording_storage_warning">កន្លែងផ្ទុកមិនគ្រប់គ្រាន់! តើអ្នកចង់រក្សាទុកនូវសម្លេងដែលកំពុងថតមែនទេ?</string> + <string name="already_exists">មានរួចហើយ</string> + <string name="toast_in_call">អ្នកមិនអាចបើកវិទ្យុ FM បានទេពេលអ្នកកំពុងហៅ ។</string> + <string name="empty_list">បញ្ជីប៉ុស្តិ៍ទទេ ។</string> + <string name="optmenu_speaker">ឧបល័រ</string> + <string name="optmenu_earphone">កាសស្តាប់ត្រចៀក</string> + <string name="not_available">បច្ចុប្បន្នមិនអាចរកបានទេ</string> + <string name="add_to_favorite1">បន្ថែមទៅក្នុងការសិតប៉ុស្តិ៍វិទ្យុឡើងវិញ</string> + <string name="contmenu_item_delete1">លុបចេញពីក្នុងការសិតប៉ុស្តិ៍វិទ្យុឡើងវិញ</string> + <string name="dlg_delete_confirm_title1">បញ្ជាក់ការលុបចោលពីក្នុងការសិតប៉ុស្តិ៍ឡើងវិញ</string> + <string name="dlg_delete_confirm_text1">តើប្រាកដទេថាអ្នកចង់លុបប៉ុស្តិ៍នេះចេញពីក្នុងការសិតប៉ុស្តិ៍ឡើងវិញ?</string> + <string name="toast_favorite_full1">មិនអាចបន្ថែមប៉ុស្តិ៍ទៅក្នុងការសិតប៉ុស្តិ៍លើងវិញ ដោយសាវាពេញហើយ ។</string> + <string name="toast_already_favorite1">ប៉ុស្តិ៍នេះស្ថិតនៅក្នុងបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញរួចហើយ ។</string> + <string name="toast_channel_deleted1">បានលុបចោលពីបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញដោយជ០គជ័យ ។</string> + <string name="toast_channel_added1">បានបន្ថែមទៅក្នុងបញ្ជីសិតប៉ុស្តិ៍ឡើងវិញដោយជោគជ័យ ។</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-ko/strings.xml b/MediaTek/FmRadio/res/values-ko/strings.xml new file mode 100755 index 0000000..839ae90 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ko/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM 라디오</string> + <string name="favorite_manager">채널 목록</string> + <string name="add_to_favorite">즐겨찾기에 추가</string> + <string name="optmenu_search">검색</string> + <string name="optmenu_exit">종료</string> + <string name="contmenu_title">작업</string> + <string name="contmenu_item_edit">편집</string> + <string name="contmenu_item_delete">즐겨찾기에서 제거</string> + <string name="dlg_noantenna_text">안테나로 이어폰이 필요합니다. 이어폰을 연결하십시오.</string> + <string name="dlg_noantenna_title">이어폰에 연결</string> + <string name="btn_yes">예</string> + <string name="btn_no">아니요</string> + <string name="btn_ok">확인</string> + <string name="btn_cancel">취소</string> + <string name="dlg_progress_title">검색</string> + <string name="dlg_progress_text">채널을 검색하는 중...</string> + <string name="dlg_addedit_station_name">이름:</string> + <string name="dlg_addedit_station_freq">주파수:</string> + <string name="dlg_addedit_title_edit">주파수 편집</string> + <string name="default_station_name">새 주파수</string> + <string name="dlg_delete_confirm_title">즐겨찾기에서 제거 확인</string> + <string name="dlg_delete_confirm_text">이 채널을 즐겨찾기에서 제거하시겠습니까?</string> + <string name="toast_favorite_full">즐겨찾기 목록이 가득 차서 채널을 추가할 수 없습니다.</string> + <string name="toast_already_favorite">이 채널은 이미 즐겨찾기 목록에 있습니다.</string> + <string name="toast_channel_deleted">즐겨찾기에서 성공적으로 제거되었습니다.</string> + <string name="toast_channel_added">즐겨찾기에 성공적으로 추가되었습니다.</string> + <string name="toast_channel_searched">검색된 사용 가능한 채널:</string> + <string name="toast_cannot_search">사용 가능한 채널을 검색할 수 없습니다.</string> + <string name="toast_invalid_frequency">현재 위치에 대한 잘못된 주파수. 유효한 주파수 범위: 87.5-108.0</string> + <string name="toast_invalid_input">잘못된 입력, 유효한 값은 0 또는 5입니다.</string> + <string name="optmenu_rds_settings">RDS 설정</string> + <string name="dlg_rds_settings_channel_information">채널 정보</string> + <string name="dlg_rds_settings_alternative_frequency">대체 주파수</string> + <string name="sound_mode">사운드 모드</string> + <string name="more">자세히</string> + <string name="power">거듭제곱</string> + <string name="edit_frequency_overwrite_text">"덮어쓰기"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">이어폰을 연결하여 라디오 안테나로서 사용하십시오.</string> + <string name="fm_recorder_name">FM 레코더</string> + <string name="toast_recording_lost_warning">SD 제거로 인해 녹음이 손실됩니다!</string> + <string name="toast_start_recording">녹음 시작...</string> + <string name="toast_sdcard_missing">SD 카드가 없습니다!</string> + <string name="toast_sdcard_insufficient_space">SD 카드 공간이 부족합니다!</string> + <string name="toast_recorder_internal_error">레코더에서 내부 오류가 발생했습니다!</string> + <string name="toast_player_internal_error">플레이어에서 내부 오류가 발생했습니다!</string> + <string name="toast_powerup_before_record_warning">먼저 FM 전원을 켜십시오!</string> + <string name="optmenu_record">FM 녹음</string> + <string name="btn_save_recording">저장</string> + <string name="btn_discard_recording">폐기</string> + <string name="edit_recording_name_hint">여기에 파일 이름을 입력</string> + <string name="dlg_save_recording_title">녹음 파일 저장</string> + <string name="dlg_save_recording_storage_warning">저장 공간이 부족합니다! 현재 녹음을 저장하시겠습니까?</string> + <string name="already_exists">이미 존재합니다</string> + <string name="toast_in_call">통화 중에는 FM 라디오를 시작할 수 없습니다.</string> + <string name="empty_list">채널 목록이 비어 있습니다.</string> + <string name="optmenu_speaker">"스피커"</string> + <string name="optmenu_earphone">헤드폰</string> + <string name="not_available">현재 사용할 수 없음</string> + <string name="add_to_favorite1">사전설정 채널에 추가</string> + <string name="contmenu_item_delete1">사전설정 채널에서 제거</string> + <string name="dlg_delete_confirm_title1">사전설정 채널에서 제거 확인</string> + <string name="dlg_delete_confirm_text1">이 채널을 사전설정 채널에서 제거하시겠습니까?</string> + <string name="toast_favorite_full1">사전설정 채널 목록이 가득 차서 채널을 추가할 수 없습니다.</string> + <string name="toast_already_favorite1">이 채널은 이미 사전설정 채널 목록에 있습니다.</string> + <string name="toast_channel_deleted1">사전설정 채널에서 성공적으로 제거되었습니다.</string> + <string name="toast_channel_added1">사전설정 채널에 성공적으로 추가되었습니다.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-lo-rLA/strings.xml b/MediaTek/FmRadio/res/values-lo-rLA/strings.xml new file mode 100755 index 0000000..6911328 --- /dev/null +++ b/MediaTek/FmRadio/res/values-lo-rLA/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">ວິທະຍຸ FM</string> + <string name="dlg_progress_title">ຊອກຫາ</string> + <string name="btn_yes">ແມ່ນແລ້ວ</string> + <string name="optmenu_speaker">ຜູ້ຢິງເວົ້າ</string> + <string name="edit_frequency_overwrite_text">ຂຽນກ່ຽວກັບການເທິງ</string> + <string name="toast_start_recording">ເລີ່ມຕົ້ນການບັນທຶກ…</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">ບັນຊີລາຍຊື່ຊ່ອງເປົ່າຫວ່າງ.</string> + <string name="optmenu_rds_settings">ການປັບຄ່າ RDS </string> + <string name="toast_channel_searched">ຊອກຫາຊ່ອງທາງອອກທີ່ມີຢູ່:</string> + <string name="already_exists">ມີແລ້ວ</string> + <string name="dlg_noantenna_title">ສຽບໃນໂທລະສັບຫູ</string> + <string name="add_to_favorite">ເພີ່ມເຖິງຄວາມຕ້ອງການ</string> + <string name="toast_sdcard_insufficient_space">ຊ່ອງບັດ SD ບໍ່ພຽງພໍ!</string> + <string name="dlg_delete_confirm_title">ຢືນຢັນອອກຈາກຄວາມຕ້ອງການ</string> + <string name="optmenu_record">ການບັນທຶກການ FM</string> + <string name="optmenu_earphone">ໂທລະສັບຫູ</string> + <string name="sound_mode">ຮູບແບບສຽງ</string> + <string name="toast_already_favorite">ຊ່ອງທາງນີ້ແມ່ນຢູ່ໃນບັນຊີລາຍຊື່ຂອງຄວາມຕ້ອງການ.</string> + <string name="not_available">ປະຈຸບັນຍັງບໍ່ທັນມີ</string> + <string name="toast_channel_deleted">ການໂຍກຍ້າຍສົບຜົນສໍາເລັດຈາກຄວາມຕ້ອງການ.</string> + <string name="toast_channel_added">ເພີ່ມສົບຜົນສໍາເລັດກັບຄວາມຕ້ອງການ.</string> + <string name="dlg_rds_settings_channel_information">ຂໍ້ມູນຂ່າວສານທາງ</string> + <string name="toast_favorite_full">ບໍ່ສາມາດເພີ່ມຊ່ອງທາງໃນການບັນຊີຂອງທ່ານເພາະວ່າມັນເປັນອັນເຕັມທີ່.</string> + <string name="btn_save_recording">ຊ່ວຍປະຢັດ</string> + <string name="optmenu_search">ຊອກຫາ</string> + <string name="dlg_rds_settings_alternative_frequency">ຄວາມຖີ່ຂອງການເລືອກ</string> + <string name="dlg_progress_text">ຊ່ອງທາງການຊອກຫາ…</string> + <string name="optmenu_exit">ອອກໄປ</string> + <string name="more">ອ່ານຕໍ່</string> + <string name="btn_discard_recording">ຖິ້ມ</string> + <string name="contmenu_item_edit">ດັດແກ້</string> + <string name="toast_cannot_search">ບໍ່ສາມາດຊອກຫາຊ່ອງທາງອອກທີ່ມີຢູ່.</string> + <string name="dlg_save_recording_storage_warning">ການເກັບຮັກສາບໍ່ພຽງພໍ! ທ່ານຕ້ອງການທີ່ຈະຊ່ວຍປະຢັດການບັນທຶກການປະຈຸບັນ?</string> + <string name="toast_in_call">ທ່ານບໍ່ສາມາດເປີດວິທະຍຸ FM ໃນເວລາທີ່ທ່ານຢູ່ໃນການເອີ້ນ.</string> + <string name="dlg_addedit_station_freq">ຄວາມຖີ່ຂອງການ:</string> + <string name="toast_recorder_internal_error">ເປັນຄວາມຜິດພາດທີ່ເກີດຂຶ້ນພາຍໃນໃນການບັນທຶກ!</string> + <string name="dlg_save_recording_title">ຊ່ວຍປະຢັດໄຟລ໌ບັນທຶກ</string> + <string name="btn_ok">ຖືກແລ້ວ</string> + <string name="power">ພະລັງງານ</string> + <string name="contmenu_item_delete">ເອົາອອກຈາກຂອງ</string> + <string name="toast_powerup_before_record_warning">ກະລຸນາພະລັງງານສູງ FM ທໍາອິດ!</string> + <string name="fm_recorder_name">ເຄື່ອງມືບັນທຶກ FM</string> + <string name="toast_recording_lost_warning">ການບັນທຶກຂອງທ່ານຈະໄດ້ຮັບການສູນເສຍເນື່ອງຈາກການໂຍກຍ້າຍ SD!</string> + <string name="dlg_delete_confirm_text">ທ່ານແນ່ໃຈວ່າທ່ານຕ້ອງການທີ່ຈະເອົາຊ່ອງທາງນີ້ຈາກຂອງ?</string> + <string name="default_station_name">ໃຫມ່ຊ່ອງ</string> + <string name="btn_cancel">ຍົກເລີກການ</string> + <string name="contmenu_title">ການປະຕິບັດ</string> + <string name="btn_no">ບໍ່</string> + <string name="favorite_manager">ບັນຊີລາຍຊື່ຊ່ອງ</string> + <string name="toast_invalid_frequency">ຄວາມຖີ່ຂອງການບໍ່ຖືກຕ້ອງສໍາລັບສະຖານທີ່ໃນປະຈຸບັນ. ຂອບເຂດຄວາມຖີ່ຂອງຄວາມຖືກຕ້ອງ: 87.5-108.0</string> + <string name="toast_sdcard_missing">ບັດ SD ຂອງທ່ານໄດ້ຖືກຫາຍ!</string> + <string name="dlg_addedit_station_name">ຊື່ຂອງທ່ານ:</string> + <string name="dlg_addedit_title_edit">ດັດແກ້ການຊ່ອງ</string> + <string name="toast_invalid_input">ການປະກອບບໍ່ຖືກຕ້ອງທີ່ສຸດ, ມູນຄ່າຖືກຕ້ອງແມ່ນ 0 ຫຼື 5.</string> + <string name="edit_recording_name_hint">ຊື່ໄຟລ໌ທີ່ນີ້</string> + <string name="dlg_noantenna_text">ທ່ານຈໍາເປັນຕ້ອງໂທລະສັບຫູເປັນສາຍອາກາດ. ກະລຸນາສຽບໃນໂທລະສັບຫູຂອງທ່ານ.</string> + <string name="toast_player_internal_error">ເປັນຄວາມຜິດພາດພາຍໃນທີ່ເກີດຂຶ້ນໃນລະ!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-lt/strings.xml b/MediaTek/FmRadio/res/values-lt/strings.xml new file mode 100755 index 0000000..7688452 --- /dev/null +++ b/MediaTek/FmRadio/res/values-lt/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM radijas</string> + <string name="favorite_manager">Kanalų sąrašas</string> + <string name="add_to_favorite">Pridėti prie mėgstamiausių</string> + <string name="optmenu_search">Ieškoti</string> + <string name="optmenu_exit">Uždaryti</string> + <string name="contmenu_title">Operacijos</string> + <string name="contmenu_item_edit">Redaguoti</string> + <string name="contmenu_item_delete">Pašalinti iš parankinių</string> + <string name="dlg_noantenna_text">Reikia ausinių vietoj antenos. Prijunkite ausines.</string> + <string name="dlg_noantenna_title">Prijungti ausines</string> + <string name="btn_yes">"Taip"</string> + <string name="btn_no">"Ne"</string> + <string name="btn_ok">Gerai</string> + <string name="btn_cancel">Atšaukti</string> + <string name="dlg_progress_title">Ieškoti</string> + <string name="dlg_progress_text">Ieškoma kanalų...</string> + <string name="dlg_addedit_station_name">Pavadinimas:</string> + <string name="dlg_addedit_station_freq">Dažnis:</string> + <string name="dlg_addedit_title_edit">Redaguoti kanalą</string> + <string name="default_station_name">Naujas kanalas</string> + <string name="dlg_delete_confirm_title">Patvirtinti šalinimą iš mėgstamiausių</string> + <string name="dlg_delete_confirm_text">Ar tikrai norite pašalinti šį kanalą iš mėgstamiausių?</string> + <string name="toast_favorite_full">Nepavyko pridėti kanalo prie mėgstamiausių sąrašo, nes jis pilnas.</string> + <string name="toast_already_favorite">Šis kanalas jau įtrauktas į mėgstamiausių sąrašą.</string> + <string name="toast_channel_deleted">Sėkmingai pašalintas iš mėgstamiausių.</string> + <string name="toast_channel_added">Sėkmingai pridėtas prie mėgstamiausių.</string> + <string name="toast_channel_searched">Rasti esami kanalai:</string> + <string name="toast_cannot_search">Nepavyko rasti esamo kanalo.</string> + <string name="toast_invalid_frequency">Dažnis netinka esamai vietovei. Tinkamos dažnio ribos: 87,5-108,0</string> + <string name="toast_invalid_input">Neteisinga paskutinė įvestis; teisinga vertė yra 0 arba 5.</string> + <string name="optmenu_rds_settings">RDS parametrai</string> + <string name="dlg_rds_settings_channel_information">Kanalo informacija</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatyvus dažnis</string> + <string name="sound_mode">Garso režimas</string> + <string name="more">"Daugiau"</string> + <string name="power">"laipsnis"</string> + <string name="toast_in_call">Negalima paleisti FM radijo kalbant telefonu.</string> + <string name="empty_list">Kanalų sąrašas tuščias.</string> + <string name="edit_frequency_overwrite_text">Perrašyti</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Prijunkite ausines, kad jos veiktų kaip radijo antena.</string> + <string name="fm_recorder_name">FM rašytuvas</string> + <string name="toast_recording_lost_warning">Išėmus SD, įrašas bus prarastas!</string> + <string name="toast_start_recording">Pradedamas įrašymas...</string> + <string name="toast_sdcard_missing">Nėra SD kortelės!</string> + <string name="toast_sdcard_insufficient_space">Nepakanka vietos SD kortelėje!</string> + <string name="toast_recorder_internal_error">Įvyko vidinė rašytuvo klaida!</string> + <string name="toast_player_internal_error">Įvyko vidinė grotuvo klaida!</string> + <string name="toast_powerup_before_record_warning">Pirmiausiai įjunkite FM radiją!</string> + <string name="optmenu_record">Įrašyti FM</string> + <string name="btn_save_recording">"Išsaugoti"</string> + <string name="btn_discard_recording">Išmesti</string> + <string name="edit_recording_name_hint">Įrašykite failo pavadinimą čia</string> + <string name="dlg_save_recording_title">Išsaugoti įrašo failas</string> + <string name="dlg_save_recording_storage_warning">Nepakanka vietos! Norite išsaugoti dabartinį įrašą?</string> + <string name="already_exists">jau yra</string> + <string name="optmenu_speaker">Garsiakalbis</string> + <string name="optmenu_earphone">Ausinės</string> + <string name="not_available">Šiuo metu nėra</string> + <string name="add_to_favorite1">Pridėti prie nustatytų kanalų</string> + <string name="contmenu_item_delete1">Šalinti iš nustatytų kanalų</string> + <string name="dlg_delete_confirm_title1">Patvirtinti šalinimą iš nustatytų kanalų</string> + <string name="dlg_delete_confirm_text1">Ar tikrai norite pašalinti šį kanalą iš nustatytų kanalų?</string> + <string name="toast_favorite_full1">Nepavyko pridėti kanalo prie nustatytų kanalų sąrašo, nes jis pilnas.</string> + <string name="toast_already_favorite1">Šis kanalas jau įtrauktas į nustatytų kanalų sąrašą.</string> + <string name="toast_channel_deleted1">Sėkmingai pašalintas iš nustatytų kanalų.</string> + <string name="toast_channel_added1">Sėkmingai pridėtas prie nustatytų kanalų.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-lv/strings.xml b/MediaTek/FmRadio/res/values-lv/strings.xml new file mode 100755 index 0000000..8356149 --- /dev/null +++ b/MediaTek/FmRadio/res/values-lv/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM radio</string> + <string name="favorite_manager">Kanālu saraksts</string> + <string name="add_to_favorite">Pievienot izlasei</string> + <string name="optmenu_search">Meklēt</string> + <string name="optmenu_exit">Aizvērt</string> + <string name="contmenu_title">Darbības</string> + <string name="contmenu_item_edit">Rediģēt</string> + <string name="contmenu_item_delete">Noņemt no izlases</string> + <string name="dlg_noantenna_text">Austiņas nepieciešamas kā antena. Pievienojiet austiņas.</string> + <string name="dlg_noantenna_title">Pievienot austiņas</string> + <string name="btn_yes">"Jā"</string> + <string name="btn_no">"Nē"</string> + <string name="btn_ok">Labi</string> + <string name="btn_cancel">Atcelt</string> + <string name="dlg_progress_title">Meklēt</string> + <string name="dlg_progress_text">Meklē kanālus...</string> + <string name="dlg_addedit_station_name">Nosaukums:</string> + <string name="dlg_addedit_station_freq">Frekvence:</string> + <string name="dlg_addedit_title_edit">Rediģēt kanālu</string> + <string name="default_station_name">Jauns kanāls</string> + <string name="dlg_delete_confirm_title">Apstiprināt noņemšanu no izlases</string> + <string name="dlg_delete_confirm_text">Vai tiešām vēlaties noņemt šo kanālu no izlases?</string> + <string name="toast_favorite_full">Nevar pievienot kanālu izlases sarakstam, jo tas ir pilns.</string> + <string name="toast_already_favorite">Šis kanāls jau ir izlases sarakstā.</string> + <string name="toast_channel_deleted">Veiksmīgi noņemts no izlases.</string> + <string name="toast_channel_added">Veiksmīgi pievienots izlasei.</string> + <string name="toast_channel_searched">Atrasti pieejamie kanāli:</string> + <string name="toast_cannot_search">Nevar atrast pieejamos kanālus.</string> + <string name="toast_invalid_frequency">Pašreizējai atrašanās vietai nederīga frekvence. Derīgu frekvenču diapazons: 87,5-108,0</string> + <string name="toast_invalid_input">Pēdējā nederīgā ievade, derīga vērtība ir no 0 līdz 5.</string> + <string name="optmenu_rds_settings">RDS iestatījumi</string> + <string name="dlg_rds_settings_channel_information">Kanāla informācija</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatīva frekvence</string> + <string name="sound_mode">Skaņas režīms</string> + <string name="more">"Vairāk"</string> + <string name="power">"pakāpe"</string> + <string name="toast_in_call">Zvanīšanas laikā nevar palaist FM radio.</string> + <string name="empty_list">Kanālu saraksts ir tukšs.</string> + <string name="edit_frequency_overwrite_text">Pārrakstīt</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Pievienojiet austiņas, lai lietotu kā radio antenu.</string> + <string name="fm_recorder_name">FM ierakstītājs</string> + <string name="toast_recording_lost_warning">Pēc SD kartes izņemšanas ieraksts tiks zaudēts!</string> + <string name="toast_start_recording">Sāk ierakstīšanu...</string> + <string name="toast_sdcard_missing">Nepieciešama SD karte!</string> + <string name="toast_sdcard_insufficient_space">SD kartē nepietiek vietas!</string> + <string name="toast_recorder_internal_error">Rakstītājā radās iekšēja kļūda!</string> + <string name="toast_player_internal_error">Atskaņotājā radās iekšēja kļūda!</string> + <string name="toast_powerup_before_record_warning">Vispirms ieslēdziet FM!</string> + <string name="optmenu_record">Ierakstīt FM</string> + <string name="btn_save_recording">"Saglabāt"</string> + <string name="btn_discard_recording">Atmest</string> + <string name="edit_recording_name_hint">Faila nosaukumu ievadiet šeit</string> + <string name="dlg_save_recording_title">Saglabāt ierakstīto failu</string> + <string name="dlg_save_recording_storage_warning">Nepietiekama atmiņa! Vai vēlaties saglabāt pašreizējo ierakstu?</string> + <string name="already_exists">jau eksistē</string> + <string name="optmenu_speaker">Skaļrunis</string> + <string name="optmenu_earphone">Austiņas</string> + <string name="not_available">Pašlaik nav pieejams</string> + <string name="add_to_favorite1">Pievienot iepriekš iestatītiem kanāliem</string> + <string name="contmenu_item_delete1">Noņemt no iepriekš iestatītiem kanāliem</string> + <string name="dlg_delete_confirm_title1">Apstiprināt noņemšanu no iepriekš iestatītiem kanāliem</string> + <string name="dlg_delete_confirm_text1">Vai tiešām vēlaties noņemt šo kanālu no iepriekš iestatītiem kanāliem?</string> + <string name="toast_favorite_full1">Nevar pievienot kanālu iepriekš iestatītu kanālu sarakstam, jo tas ir pilns.</string> + <string name="toast_already_favorite1">Šis kanāls jau ir iepriekš iestatīto kanālu sarakstā.</string> + <string name="toast_channel_deleted1">Veiksmīgi noņemts no iepriekš iestatītiem kanāliem.</string> + <string name="toast_channel_added1">Veiksmīgi pievienots iepriekš iestatītiem kanāliem.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-mn-rMN/strings.xml b/MediaTek/FmRadio/res/values-mn-rMN/strings.xml new file mode 100755 index 0000000..2a17335 --- /dev/null +++ b/MediaTek/FmRadio/res/values-mn-rMN/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM радио</string> + <string name="dlg_progress_title">Хайх</string> + <string name="btn_yes">Тийм</string> + <string name="optmenu_speaker">Спикер</string> + <string name="edit_frequency_overwrite_text">Дарж бичих</string> + <string name="toast_start_recording">Бичлэгийг эхлэх...</string> + <string name="fm_unit">МГц</string> + <string name="empty_list">Сувгийн жагсаалт хоосон байна.</string> + <string name="optmenu_rds_settings">RDS тохиргоо</string> + <string name="toast_channel_searched">Боломжтой сувгийг илрүүлсэн:</string> + <string name="already_exists">аль хэдийн байна</string> + <string name="dlg_noantenna_title">Чихэвчийг залгах</string> + <string name="add_to_favorite">Дуртай зүйлээ нэмэх</string> + <string name="toast_sdcard_insufficient_space">Хангалттай бус SD картын зай!</string> + <string name="dlg_delete_confirm_title">Дуртай зүйлээсээ хасахыг баталгаажуулах</string> + <string name="optmenu_record">FM-ийг бичих</string> + <string name="optmenu_earphone">Чихэвч</string> + <string name="sound_mode">Дууны горим</string> + <string name="toast_already_favorite">Энэ суваг аль хэдийн дуртай зүйлийн жагсаалтад байна.</string> + <string name="not_available">Одоогоор боломжгүй</string> + <string name="toast_channel_deleted">Дуртай зүйлээс амжилттай хаслаа.</string> + <string name="toast_channel_added">Дуртай зүйлд амжилттай нэмлээ.</string> + <string name="dlg_rds_settings_channel_information">Сувгийн мэдээлэл</string> + <string name="toast_favorite_full">Дуртай зүйлийн жагсаалт дүүрсэн тул суваг нэмж чадахгүй байна.</string> + <string name="btn_save_recording">Хадгалах</string> + <string name="optmenu_search">Хайх</string> + <string name="dlg_rds_settings_alternative_frequency">Альтернатив давтамж</string> + <string name="dlg_progress_text">Сувгуудыг хайх...</string> + <string name="optmenu_exit">Гарах</string> + <string name="more">Илүү</string> + <string name="btn_discard_recording">Хаях</string> + <string name="contmenu_item_edit">Засах</string> + <string name="toast_cannot_search">Боломжтой сувгийг илрүүлж чадахгүй байна.</string> + <string name="dlg_save_recording_storage_warning">Хангалтгүй хадгалах багтаамж! Одоогийн бичлэгийг хадгалахын хүсэж байна уу?</string> + <string name="toast_in_call">Та дуудлага хийж байх үедээ FM радиог ажиллуулах боломжгүй</string> + <string name="dlg_addedit_station_freq">Давтамж:</string> + <string name="toast_recorder_internal_error">Бичлэгт дотоод алдаа тохиолдлоо!</string> + <string name="dlg_save_recording_title">Бичлэгийн файлыг хадгалах</string> + <string name="btn_ok">Тийм</string> + <string name="power">Хүч</string> + <string name="contmenu_item_delete">Дуртай зүйлээс хасах</string> + <string name="toast_powerup_before_record_warning">FM-ээ эхлээд асаа!</string> + <string name="fm_recorder_name">FM бичигч</string> + <string name="toast_recording_lost_warning">SD-ыг чөлөөлснөөс үүдэн таны бичлэг алдагдах болно!</string> + <string name="dlg_delete_confirm_text">Энэ сувгийг өөрийн дуртай зүйлээс устгахыг хүсэж байгаадаа итгэлтэй байна уу?</string> + <string name="default_station_name">Шинэ суваг</string> + <string name="btn_cancel">Цуцлах</string> + <string name="contmenu_title">Ажиллагаа</string> + <string name="btn_no">Үгүй</string> + <string name="favorite_manager">Сувгийн жагсаалт</string> + <string name="toast_invalid_frequency">Одоогийн байршлын хүчингүй давтамж. Хүчинтэй давтамжийн хамрах хүрээ: 87.5-108.0</string> + <string name="toast_sdcard_missing">Таны SD карт байхгүй байна!</string> + <string name="dlg_addedit_station_name">Нэр:</string> + <string name="dlg_addedit_title_edit">Сувгийг засах</string> + <string name="toast_invalid_input">Сүүлийн хүчингүй оролт, хүчинтэй утга is 0 or 5.</string> + <string name="edit_recording_name_hint">Файлын нэрийг энд шивэх</string> + <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string> + <string name="toast_player_internal_error">Антен байдлаар ашиглах чихэвч хэрэгтэй. Чихэвчээ залгана уу.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-ms/strings.xml b/MediaTek/FmRadio/res/values-ms/strings.xml new file mode 100755 index 0000000..e9ba9f9 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ms/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Radio FM</string> + <string name="favorite_manager">Senarai saluran</string> + <string name="add_to_favorite">Tambah ke Kegemaran</string> + <string name="optmenu_search">Cari</string> + <string name="optmenu_exit">Keluar</string> + <string name="contmenu_title">Operasi</string> + <string name="contmenu_item_edit">Edit</string> + <string name="contmenu_item_delete">Alih keluar daripada kegemaran</string> + <string name="dlg_noantenna_text">Anda memerlukan fon telinga sebagai antena. Sila pasangkan fon telinga anda.</string> + <string name="dlg_noantenna_title">Cucukkan fon telinga</string> + <string name="btn_yes">Ya</string> + <string name="btn_no">Tidak</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Batal</string> + <string name="dlg_progress_title">Imbas</string> + <string name="dlg_progress_text">Imbas saluran…</string> + <string name="dlg_addedit_station_name">Nama:</string> + <string name="dlg_addedit_station_freq">Kekerapan:</string> + <string name="dlg_addedit_title_edit">Edit Saluran</string> + <string name="default_station_name">Saluran Baru</string> + <string name="dlg_delete_confirm_title">Sahkan Padam Saluran</string> + <string name="dlg_delete_confirm_text">Adakah anda pasti anda mahu memadam saluran ini?</string> + <string name="toast_favorite_full">Tidak boleh menambah saluran ke senarai kegemaran kerana sudah penuh.</string> + <string name="toast_already_favorite">Saluran ini sudah ada di dalam senarai kegemaran.</string> + <string name="toast_channel_deleted">Berjaya dialih keluar daripada kegemaran.</string> + <string name="toast_channel_added">Berjaya ditambah pada kegemaran.</string> + <string name="toast_channel_searched">Cari saluran yang tersedia:</string> + <string name="toast_cannot_search">Tidak dapat mencari saluran tersedia.</string> + <string name="optmenu_rds_settings">Tetapan RDS</string> + <string name="dlg_rds_settings_channel_information">Maklumat saluran</string> + <string name="dlg_rds_settings_alternative_frequency">Frekuensi alternatif</string> + <string name="more">Lebih banyak Apl</string> + <string name="power">kuasa</string> + <string name="sound_mode">Mod bunyi</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Pasang fon telinga anda untuk digunakan sebagai antena radio.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Tulis ganti"</string> + <string name="fm_recorder_name">Perakam FM</string> + <string name="toast_recording_lost_warning">Rakaman anda akan hilang disebabkan pengalihan keluar SD!</string> + <string name="toast_start_recording">Mula merakam…</string> + <string name="toast_sdcard_missing">Kad SD anda tiada!</string> + <string name="toast_sdcard_insufficient_space">Ruang kad SD tidak mencukupi!</string> + <string name="toast_recorder_internal_error">Ralat dalaman berlaku dalam perakam!</string> + <string name="toast_player_internal_error">Ralat dalaman berlaku dalam pemain!!</string> + <string name="toast_powerup_before_record_warning">Sila hidupkan FM terlebih dahulu!</string> + <string name="optmenu_record">Rakam FM</string> + <string name="btn_save_recording">Simpan</string> + <string name="btn_discard_recording">Buang</string> + <string name="edit_recording_name_hint">Taipkan nama fail di sini</string> + <string name="dlg_save_recording_title">Simpan fail rakaman</string> + <string name="dlg_save_recording_storage_warning">Storan tidak mencukupi! Adakah anda mahu menyimpan rakaman semasa?</string> + <string name="already_exists">Sudah wujud</string> + <string name="toast_invalid_frequency">Frekuensi tidak sah untuk lokasi semasa. Skop frekuensi sah: 87.5-108.0.</string> + <string name="toast_invalid_input">Input tidak sah terakhir, nilai sah ialah 0 atau 5.</string> + <string name="toast_in_call">Anda tidak boleh melancarkan Radio FM semasa anda sedang membuat panggilan.</string> + <string name="empty_list">Senarai saluran kosong.</string> + <string name="optmenu_speaker">"Pembesar suara"</string> + <string name="optmenu_earphone">Headset</string> + <string name="not_available">Tidak tersedia pada masa ini</string> + <string name="add_to_favorite1">Tambahkan pada saluran dipratetap</string> + <string name="contmenu_item_delete1">Alih keluar daripada saluran dipratetap</string> + <string name="dlg_delete_confirm_title1">Sahkan alih keluar daripada saluran dipratetap</string> + <string name="dlg_delete_confirm_text1">Adakah anda pasti mahu mengalih keluar saluran ini daripada saluran dipratetap?</string> + <string name="toast_favorite_full1">Tidak dapat menambah saluran pada senarai saluran dipratetap kerana ia telah penuh.</string> + <string name="toast_already_favorite1">Saluran ini sudah berada dalam senarai saluran dipratetap.</string> + <string name="toast_channel_deleted1">Berjaya dialih keluar daripada saluran dipratetap.</string> + <string name="toast_channel_added1">Berjaya ditambahkan pada saluran dipratetap.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-my-rMM/strings.xml b/MediaTek/FmRadio/res/values-my-rMM/strings.xml new file mode 100755 index 0000000..ee751b5 --- /dev/null +++ b/MediaTek/FmRadio/res/values-my-rMM/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM ရေဒီယို</string> + <string name="favorite_manager">ချန်နယ် စာရင်း</string> + <string name="add_to_favorite">အနှစ်သက်ဆုံးထဲသို့ ထည့်ရန်</string> + <string name="optmenu_search">ရှာဖွေရန်</string> + <string name="optmenu_exit">ထွက်ရန်</string> + <string name="contmenu_title">လုပ်ငန်းများ</string> + <string name="contmenu_item_edit">တည်းဖြတ်ရန်</string> + <string name="contmenu_item_delete">အနှစ်သက်ဆုံးထဲမှ ဖယ်ရှားရန်</string> + <string name="dlg_noantenna_text">ဧရိယာတိုင်အဖြစ် နားကြပ်လိုအပ်သည်။ သင့်နားကြပ်ကြိုးတပ်ပါ။</string> + <string name="dlg_noantenna_title">နားကြပ်ကို တပ်လိုက်ပါ</string> + <string name="btn_yes">မှန်</string> + <string name="btn_no">မှား</string> + <string name="btn_ok">လုပ်မည်</string> + <string name="btn_cancel">ပယ်ဖျက်</string> + <string name="dlg_progress_title">ရှာဖွေရန်</string> + <string name="dlg_progress_text">ချန်နယ်များကို ရှာရန်…</string> + <string name="dlg_addedit_station_name">အမည်-</string> + <string name="dlg_addedit_station_freq">ကြိမ်နှုန်း-</string> + <string name="dlg_addedit_title_edit">ချန်နယ်ကို တည်းဖြတ်ရန်</string> + <string name="default_station_name">ချန်နယ်အသစ်</string> + <string name="dlg_delete_confirm_title">အနှစ်သက်ဆုံးများမှ ဖယ်ရှားရန် အတည်ပြုပါ</string> + <string name="dlg_delete_confirm_text">အနှစ်သက်ဆုံးများမှ ဤချန်နယ်ကို သင်ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။</string> + <string name="toast_favorite_full">ပြည့်နေသောကြောင့် အနှစ်သက်ဆုံးစာရင်းထဲ့သို့ ချန်နယ်ကို ထပ်မထည့်နိုင်ပါ။</string> + <string name="toast_already_favorite">ဤချန်နယ်သည် အနှစ်သက်ဆုံးစာရင်းထဲတွင် ရှိပြီးဖြစ်သည်</string> + <string name="toast_channel_deleted">အနှစ်သက်ဆုံးများမှ အောင်မြင်စွာ ဖယ်ရှားပြီးဖြစ်သည်။</string> + <string name="toast_channel_added">အနှစ်သက်ဆုံးများထဲသို့ အောင်မြင်စွာ ထည့်ပြီးဖြစ်သည်။</string> + <string name="toast_channel_searched">ရနိုင်သော ချန်နယ်များကို ရှာခဲ့သည်-</string> + <string name="toast_cannot_search">ရနိုင်သော ချန်နယ်များကို မရှာနိုင်ခဲ့ပါ-</string> + <string name="toast_invalid_frequency">လက်ရှိနေရာအတွက် ကြိမ်နှုန်း မမှန်ပါ။ မှန်ကန်သော အတိုင်းအတာ- ၈၇.၅-၁၀၈.၀</string> + <string name="toast_invalid_input">ထည့်သွင်းမှု မမှန်ကန်ပါ၊ မှန်ကန်သော တန်ဖိုးမှာ ၀ သို့မဟုတ် ၅။</string> + <string name="optmenu_rds_settings">RDS ဆက်တင်များ</string> + <string name="dlg_rds_settings_channel_information">ချန်နယ်အချက်အလက်များ</string> + <string name="dlg_rds_settings_alternative_frequency">အခြား ကြိမ်နှုန်း</string> + <string name="sound_mode">အသံနည်းစနစ်</string> + <string name="more">နောက်ထပ်</string> + <string name="power">ထပ်ကိန်း</string> + <string name="edit_frequency_overwrite_text">ထပ်ရေးရန်</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">ရေဒီယို အန်တီနာတစ်ခုအဖြစ် သုံးရန် သင့် နားကြပ်များကို တပ်ဆင်ပါ။</string> + <string name="fm_recorder_name">FM အသံဖမ်းစက်</string> + <string name="toast_recording_lost_warning">SD ဖယ်ရှားမှုကြောင့် သင်၏ အသံဖမ်းခြင်းသည် ပျောက်ဆုံးသွားလိမ့်မည်။</string> + <string name="toast_start_recording">အသံဖမ်းခြင်း စတင်ရန်</string> + <string name="toast_sdcard_missing">သင်၏ SD ကတ် ပျောက်နေသည်။</string> + <string name="toast_sdcard_insufficient_space">SD ကတ်နေရာလွတ် မလုံလောက်ပါ။</string> + <string name="toast_recorder_internal_error">အသံဖမ်းစက်တွင် အတွင်းပိုင်း ပြဿနာတစ်ခု ဖြစ်သည်။</string> + <string name="toast_player_internal_error">ဖွင့်စက်တွင် အတွင်းပိုင်း ပြဿနာတစ်ခု ဖြစ်သည်။</string> + <string name="toast_powerup_before_record_warning">FM ကို ဦးစွာ ဖွင့်ပါ။</string> + <string name="optmenu_record">FM ကို မှတ်တမ်းတင်ရန်</string> + <string name="btn_save_recording">သိမ်းရန်</string> + <string name="btn_discard_recording">စွန့်ပစ်ရန်</string> + <string name="edit_recording_name_hint">ဤနေရာတွင် ဖိုင်အမည်ကို ရေးသွင်းပါ</string> + <string name="dlg_save_recording_title">အသံဖမ်းနေသောဖိုင်ကို သိမ်းရန်</string> + <string name="dlg_save_recording_storage_warning">သိမ်းဆည်းနေရာ မလုံလောက်ပါ။ လက်ရှိအသံဖမ်းမှုကို သိမ်းလိုပါသလား။</string> + <string name="already_exists">ရှိပြီးဖြစ်သည်</string> + <string name="toast_in_call">သင်ဖုန်းခေါ်ဆိုနေစဉ် FM ရေဒီယိုဖွင့်၍မရပါ။</string> + <string name="empty_list">လိုင်းစာရင်းမှာ ဗလာဖြစ်နေသည်။</string> + <string name="optmenu_speaker">စပီကာ</string> + <string name="optmenu_earphone">နားကြပ်</string> + <string name="not_available">လောလောဆယ် မရနိုင်ပါ</string> + <string name="add_to_favorite1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲသို့ ထည့်ရန်</string> + <string name="contmenu_item_delete1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲမှ ဖယ်ရှားရန်</string> + <string name="dlg_delete_confirm_title1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ ဖယ်ရှားရန် အတည်ပြုပါ</string> + <string name="dlg_delete_confirm_text1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ ဤချန်နယ်ကို သင်ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။</string> + <string name="toast_favorite_full1">ပြည့်နေသောကြောင့် ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်စာရင်းထဲ့သို့ ချန်နယ်ကို ထပ်မထည့်နိုင်ပါ။</string> + <string name="toast_already_favorite1">ဤချန်နယ်သည် ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်စာရင်းထဲတွင် ရှိပြီးဖြစ်သည်</string> + <string name="toast_channel_deleted1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များမှ အောင်မြင်စွာ ဖယ်ရှားပြီးဖြစ်သည်။</string> + <string name="toast_channel_added1">ကြိုတင်သတ်မှတ်ထားသော ချန်နယ်များထဲသို့ အောင်မြင်စွာ ထည့်ပြီးဖြစ်သည်။</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-my-rZG/strings.xml b/MediaTek/FmRadio/res/values-my-rZG/strings.xml new file mode 100755 index 0000000..0735d62 --- /dev/null +++ b/MediaTek/FmRadio/res/values-my-rZG/strings.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">FM ေရဒီယို</string> + <string name="favorite_manager">ခ်န္နယ္ စာရင္း</string> + <string name="add_to_favorite">အႏွစ္သက္ဆံုးထဲသို႔ ထည့္ရန္</string> + <string name="add_to_favorite1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲသို႔ ထည့္ရန္</string> + <string name="optmenu_search">ရွာေဖြပါ</string> + <string name="optmenu_exit">ထြက္ပါ</string> + <string name="contmenu_title">လုပ္ငန္းမ်ား</string> + <string name="contmenu_item_edit">တည္းျဖတ္ပါ</string> + <string name="contmenu_item_delete">အႏွစ္သက္ဆံုးမ်ားမွ ဖယ္ရွားရန္</string> + <string name="contmenu_item_delete1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲမွ ဖယ္ရွားရန္</string> + <string name="dlg_noantenna_text">ဧရိယာတိုင္အျဖစ္ နားၾကပ္လိုအပ္သည္။ သင့္နားၾကပ္ ႀကိဳးတပ္ပါ။</string> + <string name="dlg_noantenna_title">နားၾကပ္ကို တပ္လိုက္ပါ</string> + <string name="btn_yes">ဟုတ္ပါသည္</string> + <string name="btn_no">မဟုတ္ပါ</string> + <string name="btn_ok">အိုေက</string> + <string name="btn_cancel">မလုပ္ပါ</string> + <string name="dlg_progress_title">ရွာေဖြပါ</string> + <string name="dlg_progress_text">ခ်န္နယ္မ်ားကို ရွာရန္…</string> + <string name="dlg_addedit_station_name">အမည္-</string> + <string name="dlg_addedit_station_freq">ႀကိမ္ႏႈန္း-</string> + <string name="dlg_addedit_title_edit">ခ်န္နယ္ကို တည္းျဖတ္ပါ</string> + <string name="default_station_name">ခ်န္နယ္အသစ္</string> + <string name="dlg_delete_confirm_title">အႏွစ္သက္ဆံုးမ်ားမွ ဖယ္ရွားရန္ အတည္ျပဳပါ</string> + <string name="dlg_delete_confirm_title1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ဖယ္ရွားရန္ အတည္ျပဳပါ</string> + <string name="dlg_delete_confirm_text">အႏွစ္သက္ဆံုးမ်ားမွ ဤခ်န္နယ္ကို သင္ဖယ္ရွားလိုသည္မွာ ေသခ်ာပါသလား။</string> + <string name="dlg_delete_confirm_text1">ႀကိဳတင္သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ဤခ်န္နယ္ကို သင္ဖယ္ရွားလိုသည္မွာ ေသခ်ာပါသလား။</string> + <string name="toast_favorite_full">ျပည့္ေနေသာေၾကာင့္ အႏွစ္သက္ဆံုး စာရင္းထဲသို႔ ခ်န္နယ္ကို ထပ္မထည့္ႏိုင္ပါ။</string> + <string name="toast_favorite_full1">ျပည့္ေနေသာေၾကာင့္ ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္စာရင္းထဲ့သို႔ ခ်န္နယ္ကို ထပ္မထည့္ႏိုင္ပါ။</string> + <string name="toast_already_favorite">ဤခ်န္နယ္သည္ အႏွစ္သက္ဆံုး စာရင္းထဲတြင္ ရွိၿပီးျဖစ္သည္။</string> + <string name="toast_already_favorite1">ဤခ်န္နယ္သည္ ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္စာရင္းထဲတြင္ ရွိၿပီးျဖစ္သည္။</string> + <string name="toast_channel_deleted">အႏွစ္သက္ဆံုးမ်ားမွ ေအာင္ျမင္စြာ ဖယ္ရွားၿပီးျဖစ္သည္။</string> + <string name="toast_channel_deleted1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားမွ ေအာင္ျမင္စြာ ဖယ္ရွားၿပီးျဖစ္သည္။</string> + <string name="toast_channel_added">အႏွစ္သက္ဆံုးမ်ားထဲသို႔ ေအာင္ျမင္စြာ ထည့္ၿပီးျဖစ္သည္။</string> + <string name="toast_channel_added1">ႀကိဳတင္ သတ္မွတ္ထားေသာ ခ်န္နယ္မ်ားထဲသို႔ ေအာင္ျမင္စြာ ထည့္ၿပီးျဖစ္သည္။</string> + <string name="toast_channel_searched">ရႏိုင္ေသာ ခ်န္နယ္မ်ားကို ရွာခဲ့သည္-</string> + <string name="toast_cannot_search">ရႏိုင္ေသာ ခ်န္နယ္မ်ားကို မရွာႏိုင္ခဲ့ပါ-</string> + <string name="toast_invalid_frequency">လက္ရွိေနရာအတြက္ ႀကိမ္ႏႈန္း မမွန္ပါ။ မွန္ကန္ေသာ အတိုင္းအတာ- ၈၇.၅-၁၀၈.ဝ</string> + <string name="toast_invalid_input">ထည့္သြင္းမႈ မမွန္ကန္ပါ၊ မွန္ကန္ေသာ တန္ဖိုးမွာ ဝ သို႔မဟုတ္ ၅။</string> + <string name="optmenu_rds_settings">RDS ဆက္တင္မ်ား</string> + <string name="dlg_rds_settings_channel_information">ခ်န္နယ္ အခ်က္အလက္မ်ား</string> + <string name="dlg_rds_settings_alternative_frequency">အျခား ႀကိမ္ႏႈန္း</string> + <string name="sound_mode">အသံနည္းစနစ္</string> + <string name="more">ေနာက္ထပ္</string> + <string name="power">ထပ္ကိန္း</string> + <string name="toast_in_call">သင္ဖုန္းေခၚဆိုေနစဥ္ FM ေရဒီယိုဖြင့္၍မရပါ။</string> + <string name="empty_list">လိုင္းစာရင္းမွာ ဗလာျဖစ္ေနသည္။</string> + <string name="edit_frequency_overwrite_text">ထပ္ေရးရန္</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">နားၾကပ္ကို တပ္လိုက္ပါ</string> + <string name="fm_recorder_name">FM အသံဖမ္းစက္</string> + <string name="toast_recording_lost_warning">SD ဖယ္ရွားမႈေၾကာင့္ သင္၏ အသံဖမ္းျခင္းသည္ ဆုံး႐ႈံးသြားလိမ့္မည္။</string> + <string name="toast_start_recording">အသံဖမ္းျခင္း စတင္ရန္</string> + <string name="toast_sdcard_missing">သင္၏ SD ကတ္ ေပ်ာက္ေနသည္။</string> + <string name="toast_sdcard_insufficient_space">SD ကတ္ေနရာလြတ္ မလံုေလာက္ပါ။</string> + <string name="toast_recorder_internal_error">အသံဖမ္းစက္တြင္ အတြင္းပိုင္း ျပႆနာတစ္ခု ျဖစ္သည္။</string> + <string name="toast_player_internal_error">ဖြင့္စက္တြင္ အတြင္းပိုင္း ျပႆနာတစ္ခု ျဖစ္သည္။</string> + <string name="toast_powerup_before_record_warning">FM ကို ဦးစြာ ဖြင့္ပါ။</string> + <string name="optmenu_record">FM ကို မွတ္တမ္းတင္ရန္</string> + <string name="btn_save_recording">သိမ္းဆည္းပါ</string> + <string name="btn_discard_recording">ျဖဳတ္ခ်ပါ</string> + <string name="edit_recording_name_hint">ဤေနရာတြင္ ဖိုင္အမည္ကို ေရးသြင္းပါ</string> + <string name="dlg_save_recording_title">အသံဖမ္းေနေသာဖိုင္ကို သိမ္းရန္</string> + <string name="dlg_save_recording_storage_warning">သိမ္းဆည္းေနရာ မလံုေလာက္ပါ။ လက္ရွိအသံဖမ္းမႈကို သိမ္းလိုပါသလား။</string> + <string name="already_exists">ရွိၿပီးျဖစ္သည္</string> + <string name="optmenu_speaker">စပီကာ</string> + <string name="optmenu_earphone">နားၾကပ္</string> + <string name="not_available">ေလာေလာဆယ္ မရႏိုင္ပါ</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-nb/strings.xml b/MediaTek/FmRadio/res/values-nb/strings.xml new file mode 100755 index 0000000..7082e10 --- /dev/null +++ b/MediaTek/FmRadio/res/values-nb/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-radio</string> + <string name="favorite_manager">Kanalliste</string> + <string name="add_to_favorite">Legg til favoritt</string> + <string name="optmenu_search">Søk</string> + <string name="optmenu_exit">Avslutt</string> + <string name="contmenu_title">Operasjoner</string> + <string name="contmenu_item_edit">Rediger</string> + <string name="contmenu_item_delete">Fjern fra favoritter</string> + <string name="dlg_noantenna_text">Du må bruke en øretelefon som antenne. Plugg inn øretelefoner.</string> + <string name="dlg_noantenna_title">Plugg inn øretelefon</string> + <string name="btn_yes">"Ja"</string> + <string name="btn_no">"Nei"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Avbryt</string> + <string name="dlg_progress_title">Søk</string> + <string name="dlg_progress_text">Søk etter kanaler …</string> + <string name="dlg_addedit_station_name">Navn:</string> + <string name="dlg_addedit_station_freq">Frekvens:</string> + <string name="dlg_addedit_title_edit">Rediger kanal</string> + <string name="default_station_name">Ny kanal</string> + <string name="dlg_delete_confirm_title">Bekreft fjerning fra favoritter</string> + <string name="dlg_delete_confirm_text">Er du sikker på at du vil fjerne denne kanalen fra favoritter?</string> + <string name="toast_favorite_full">Kan ikke legge til kanalen i favorittlisten, da listen er full.</string> + <string name="toast_already_favorite">Kanalen er allerede i favorittlisten.</string> + <string name="toast_channel_deleted">Kanalen ble fjernet fra favoritter.</string> + <string name="toast_channel_added">Kanalen ble lagt til i favoritter.</string> + <string name="toast_channel_searched">Fant tilgjengelige kanaler:</string> + <string name="toast_cannot_search">Kan ikke finne tilgjengelige kanal.</string> + <string name="toast_invalid_frequency">Ugyldig frekvens for gjeldende plassering. Gyldig frekvensomfang: 87,5–108,0</string> + <string name="toast_invalid_input">Ugyldige inndata. Gyldig verdi er 0 eller 5.</string> + <string name="optmenu_rds_settings">RDS-innstillinger</string> + <string name="dlg_rds_settings_channel_information">Kanalinformasjon</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string> + <string name="sound_mode">Lydmodus</string> + <string name="more">"Mer"</string> + <string name="power">"potens"</string> + <string name="toast_in_call">Du kan ikke starte FM-radio når du er i en samtale.</string> + <string name="empty_list">Kanallisten er tom.</string> + <string name="edit_frequency_overwrite_text">Overskriv</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Plugg inn øretelefonene for å bruke som en radioantenne.</string> + <string name="fm_recorder_name">FM-opptaker</string> + <string name="toast_recording_lost_warning">Opptaket vil gå tapt på grunn av fjerning av SD!</string> + <string name="toast_start_recording">Start opptak …</string> + <string name="toast_sdcard_missing">SD-kortet mangler!</string> + <string name="toast_sdcard_insufficient_space">Utilstrekkelig plass på SD-kort!</string> + <string name="toast_recorder_internal_error">Det oppstod en intern feil i opptaker!</string> + <string name="toast_player_internal_error">Det oppstod en intern feil i spiller!</string> + <string name="toast_powerup_before_record_warning">Slå på FM først!</string> + <string name="optmenu_record">Ta opp FM</string> + <string name="btn_save_recording">"Lagre"</string> + <string name="btn_discard_recording">Forkast</string> + <string name="edit_recording_name_hint">Skriv inn filnavnet her</string> + <string name="dlg_save_recording_title">Lagre opptaksfil</string> + <string name="dlg_save_recording_storage_warning">Utilstrekkelig plass! Vil du lagre dette opptaket?</string> + <string name="already_exists">finnes allerede</string> + <string name="optmenu_speaker">Hoyttaler</string> + <string name="optmenu_earphone">Hodetelefon</string> + <string name="not_available">Ikke tilgjengelig for øyeblikket</string> + <string name="add_to_favorite1">Legg til forhåndsinnstilte kanaler</string> + <string name="contmenu_item_delete1">Fjern fra forhåndsinnstilte kanaler</string> + <string name="dlg_delete_confirm_title1">Bekreft fjerning fra forhåndsinnstilte kanaler</string> + <string name="dlg_delete_confirm_text1">Er du sikker på at du vil fjerne denne kontoen fra forhåndsinnstilte kanaler?</string> + <string name="toast_favorite_full1">Kan ikke legge til kanalen i liste over forhåndsinnstilte kanaler, da listen er full.</string> + <string name="toast_already_favorite1">Kanalen er allerede i listen over forhåndsinnstilte kanaler.</string> + <string name="toast_channel_deleted1">Kanalen ble fjernet fra forhåndsinnstilte kanaler.</string> + <string name="toast_channel_added1">Kanalen ble lagt til i forhåndsinnstilte kanaler.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-nl/strings.xml b/MediaTek/FmRadio/res/values-nl/strings.xml new file mode 100755 index 0000000..d176812 --- /dev/null +++ b/MediaTek/FmRadio/res/values-nl/strings.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM-radio</string> + <string name="favorite_manager">Kanalenlijst</string> + <string name="add_to_favorite">Toevoegen aan favorieten</string> + <string name="optmenu_search">Zoeken</string> + <string name="optmenu_exit">Afsluiten</string> + <string name="contmenu_title">Bewerkingen</string> + <string name="contmenu_item_edit">Bewerken</string> + <string name="contmenu_item_delete">Uit favorieten verwijderen</string> + <string name="dlg_noantenna_text">U hebt een oortelefoon nodig als antenne. Sluit de oortelefoon aan.</string> + <string name="dlg_noantenna_title">Oortelefoon aansluiten</string> + <string name="btn_yes">Ja</string> + <string name="btn_no">Nee</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Annuleren</string> + <string name="dlg_progress_title">Scannen</string> + <string name="dlg_progress_text">Kanalen scannen…</string> + <string name="dlg_addedit_station_name">Naam:</string> + <string name="dlg_addedit_station_freq">Frequentie:</string> + <string name="dlg_addedit_title_edit">Kanaal bewerken</string> + <string name="default_station_name">Nieuw kanaal</string> + <string name="dlg_delete_confirm_title">Verwijderen kanaal bevestigen</string> + <string name="dlg_delete_confirm_text">Weet u zeker dat u dit kanaal wilt verwijderen?</string> + <string name="toast_favorite_full">Kan het kanaal niet toevoegen aan de lijst met favorieten omdat deze vol is.</string> + <string name="toast_already_favorite">Dit kanaal staat al in de favorietenlijst.</string> + <string name="toast_channel_deleted">Verwijderen uit favorieten geslaagd.</string> + <string name="toast_channel_added">Toevoegen aan favorieten geslaagd.</string> + <string name="toast_channel_searched">Gezocht in beschikbare kanalen:</string> + <string name="toast_cannot_search">Kan beschikbaar kanaal niet uitzoeken:</string> + <string name="optmenu_rds_settings">RDS-instellingen</string> + <string name="dlg_rds_settings_channel_information">Kanaalinformatie</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatieve frequentie</string> + <string name="more">Meer toepassingen</string> + <string name="power">macht</string> + <string name="sound_mode">Geluidsmodus</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Sluit de oortelefoon aan om als radio-antenne te gebruiken.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Overschrijven"</string> + <string name="fm_recorder_name">FM-recorder</string> + <string name="toast_recording_lost_warning">Uw opname gaat verloren doordat de SD-kaart is verwijderd!</string> + <string name="toast_start_recording">Opname start…</string> + <string name="toast_sdcard_missing">SD-kaart ontbreekt.</string> + <string name="toast_sdcard_insufficient_space">Onvoldoende ruimte op SD-kaart!</string> + <string name="toast_recorder_internal_error">In de recorder is een interne fout opgetreden!</string> + <string name="toast_player_internal_error">In de speler is een interne fout opgetreden!</string> + <string name="toast_powerup_before_record_warning">Schakel eerst FM in!</string> + <string name="optmenu_record">FM opnemen</string> + <string name="btn_save_recording">Opslaan</string> + <string name="btn_discard_recording">Verwijderen</string> + <string name="edit_recording_name_hint">Typ hier de bestandsnaam</string> + <string name="dlg_save_recording_title">Opnamebestand opslaan</string> + <string name="dlg_save_recording_storage_warning">Onvoldoende opslagruimte! Wilt u de huidige opname opslaan?</string> + <string name="already_exists">bestaat al</string> + <string name="toast_invalid_frequency">Ongeldige frequentie voor huidige locatie. Geldig frequentiebereik: 87,5-108,0.</string> + <string name="toast_invalid_input">De laatste invoer is ongeldig, geldige waarde is 0 of 5.</string> + <string name="toast_in_call">U kunt FM-radio niet starten terwijl u een telefoongesprek voert.</string> + <string name="empty_list">Lijst met zenders is leeg.</string> + <string name="optmenu_speaker">"Luidspreker"</string> + <string name="optmenu_earphone">Kuulokkeet</string> + <string name="not_available">Momenteel niet beschikbaar</string> + <string name="add_to_favorite1">Aan vooringestelde kanalen toevoegen</string> + <string name="contmenu_item_delete1">Uit vooringestelde kanalen verwijderen</string> + <string name="dlg_delete_confirm_title1">Verwijderen uit vooringestelde kanalen bevestigen</string> + <string name="dlg_delete_confirm_text1">Wilt u werkelijk dit kanaal uit vooringestelde kanalen verwijderen?</string> + <string name="toast_favorite_full1">Kan het kanaal niet toevoegen aan de lijst met vooringestelde kanalen omdat deze vol is.</string> + <string name="toast_already_favorite1">Dit kanaal bevindt zich reeds in de lijst met vooringestelde kanalen.</string> + <string name="toast_channel_deleted1">Uit vooringestelde kanalen verwijderd.</string> + <string name="toast_channel_added1">Aan vooringestelde kanalen toegevoegd.</string> +</resources> + diff --git a/MediaTek/FmRadio/res/values-pl/strings.xml b/MediaTek/FmRadio/res/values-pl/strings.xml new file mode 100755 index 0000000..098e1ea --- /dev/null +++ b/MediaTek/FmRadio/res/values-pl/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Radio FM</string> + <string name="favorite_manager">Lista kanałów</string> + <string name="add_to_favorite">Dodaj do ulubionych</string> + <string name="optmenu_search">Wyszukaj</string> + <string name="optmenu_exit">Zakończ</string> + <string name="contmenu_title">Operacje</string> + <string name="contmenu_item_edit">Edytuj</string> + <string name="contmenu_item_delete">Usuń z ulubionych</string> + <string name="dlg_noantenna_text">Potrzebna jest antena w postaci słuchawek. Podłącz słuchawki.</string> + <string name="dlg_noantenna_title">Podłącz słuchawki</string> + <string name="btn_yes">"Tak"</string> + <string name="btn_no">"Nie"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Anuluj</string> + <string name="dlg_progress_title">Wyszukaj</string> + <string name="dlg_progress_text">Trwa wyszukiwanie kanałów...</string> + <string name="dlg_addedit_station_name">Nazwa:</string> + <string name="dlg_addedit_station_freq">Częstotliwość:</string> + <string name="dlg_addedit_title_edit">Edytuj kanał</string> + <string name="default_station_name">Nowy kanał</string> + <string name="dlg_delete_confirm_title">Potwierdź usunięcie z ulubionych</string> + <string name="dlg_delete_confirm_text">Czy na pewno chcesz usunąć ten kanał z ulubionych?</string> + <string name="toast_favorite_full">Nie można dodać kanału do listy ulubionych, ponieważ została ona zapełniona.</string> + <string name="toast_already_favorite">Kanał ten znajduje się już na liście ulubionych.</string> + <string name="toast_channel_deleted">Pomyślnie usunięto z ulubionych.</string> + <string name="toast_channel_added">Pomyślnie dodano do ulubionych.</string> + <string name="toast_channel_searched">Wyszukano dostępne kanały:</string> + <string name="toast_cannot_search">Nie można wyszukać dostępnych kanałów.</string> + <string name="toast_invalid_frequency">Nieprawidłowa częstotliwość dla bieżącej lokalizacji. Prawidłowy zakres częstotliwości: 87,5–108,0</string> + <string name="toast_invalid_input">Ostatni wpis jest nieprawidłowy; prawidłowa wartość to 0 lub 5.</string> + <string name="optmenu_rds_settings">Ustawienia RDS</string> + <string name="dlg_rds_settings_channel_information">Informacje o kanale</string> + <string name="dlg_rds_settings_alternative_frequency">Częstotliwość alternatywna</string> + <string name="sound_mode">Tryb dźwięku</string> + <string name="more">"Więcej"</string> + <string name="power">"do potęgi"</string> + <string name="toast_in_call">Nie można włączyć radia FM podczas trwania rozmowy telefonicznej.</string> + <string name="empty_list">Lista kanałów jest pusta.</string> + <string name="edit_frequency_overwrite_text">Zastąp</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Podłącz słuchawki, aby móc ich używać jako anteny radiowej.</string> + <string name="fm_recorder_name">Rejestrator FM</string> + <string name="toast_recording_lost_warning">Nagranie zostanie utracone z powodu wyjęcia karty SD!</string> + <string name="toast_start_recording">Trwa rozpoczynanie nagrywania...</string> + <string name="toast_sdcard_missing">Brak karty SD!</string> + <string name="toast_sdcard_insufficient_space">Za mało miejsca na karcie SD!</string> + <string name="toast_recorder_internal_error">Wystąpił błąd wewnętrzny w rejestratorze!</string> + <string name="toast_player_internal_error">Wystąpił błąd wewnętrzny w odtwarzaczu!</string> + <string name="toast_powerup_before_record_warning">Włącz najpierw tryb FM!</string> + <string name="optmenu_record">Nagrywaj w paśmie FM</string> + <string name="btn_save_recording">"Zapisz"</string> + <string name="btn_discard_recording">Odrzuć</string> + <string name="edit_recording_name_hint">Wpisz tutaj nazwę pliku</string> + <string name="dlg_save_recording_title">Zapisz plik nagrania</string> + <string name="dlg_save_recording_storage_warning">Za mało miejsca w pamięci! Czy chcesz zapisać bieżące nagranie?</string> + <string name="already_exists">już istnieje</string> + <string name="optmenu_speaker">Głośnik</string> + <string name="optmenu_earphone">Słuchawki</string> + <string name="not_available">Obecnie niedostępne</string> + <string name="add_to_favorite1">Dodaj do ustawionych wstępnie kanałów</string> + <string name="contmenu_item_delete1">Usuń z ustawionych wstępnie kanałów</string> + <string name="dlg_delete_confirm_title1">Potwierdź usunięcie z ustawionych wstępnie kanałów</string> + <string name="dlg_delete_confirm_text1">Czy na pewno chcesz usunąć ten kanał z ustawionych wstępnie kanałów?</string> + <string name="toast_favorite_full1">Nie można dodać kanału do listy ustawionych wstępnie kanałów, ponieważ została ona zapełniona.</string> + <string name="toast_already_favorite1">Kanał ten znajduje się już na liście ustawionych wstępnie kanałów.</string> + <string name="toast_channel_deleted1">Pomyślnie usunięto z ustawionych wstępnie kanałów.</string> + <string name="toast_channel_added1">Pomyślnie dodano do ustawionych wstępnie kanałów.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-pt-rPT/strings.xml b/MediaTek/FmRadio/res/values-pt-rPT/strings.xml new file mode 100755 index 0000000..9c6edce --- /dev/null +++ b/MediaTek/FmRadio/res/values-pt-rPT/strings.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Rádio FM</string> + <string name="favorite_manager">Lista de canais</string> + <string name="add_to_favorite">Adicionar a Favorito</string> + <string name="optmenu_search">Procurar</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">Operações</string> + <string name="contmenu_item_edit">Editar</string> + <string name="contmenu_item_delete">Remover dos favoritos</string> + <string name="dlg_noantenna_text">É necessário utilizar os auscultadores como antena. Ligue os auscultadores.</string> + <string name="dlg_noantenna_title">Plugar o fone de ouvido</string> + <string name="btn_yes">Sim</string> + <string name="btn_no">Não</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Cancelar</string> + <string name="dlg_progress_title">Sintonizar</string> + <string name="dlg_progress_text">A pesquisar canais…</string> + <string name="dlg_addedit_station_name">Nome: </string> + <string name="dlg_addedit_station_freq">Frequência:</string> + <string name="dlg_addedit_title_edit">Editar Canal</string> + <string name="default_station_name">Novo Canal</string> + <string name="dlg_delete_confirm_title">Confirmar Exclusão do Canal</string> + <string name="dlg_delete_confirm_text">Você tem certeza que deseja excluir este canal?</string> + <string name="toast_favorite_full">Impossível adicionar o canal à lista de favoritos porque ela está cheia.</string> + <string name="toast_already_favorite">Esta canal já existe na lista de favoritos.</string> + <string name="toast_channel_deleted">Remoção dos favoritos efectuada com êxito.</string> + <string name="toast_channel_added">Adição aos favoritos efectuada com êxito.</string> + <string name="toast_channel_searched">Procurado nos canais disponíveis:</string> + <string name="toast_cannot_search">Impossível encontrar canal disponível.</string> + <string name="optmenu_rds_settings">Config. RDS</string> + <string name="dlg_rds_settings_channel_information">Info. do canal</string> + <string name="dlg_rds_settings_alternative_frequency">Freqüência alternativa</string> + <string name="more">Mais Aplicações</string> + <string name="power">expoente</string> + <string name="sound_mode">Modo de som</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Ligue os seus auscultadores para os utilizar como antena de rádio.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Substituir"</string> + <string name="fm_recorder_name">Gravador FM</string> + <string name="toast_recording_lost_warning">A sua gravação irá perder-se devido à remoção do cartão SD!</string> + <string name="toast_start_recording">Iniciar gravação…</string> + <string name="toast_sdcard_missing">Não existe cartão SD!</string> + <string name="toast_sdcard_insufficient_space">Espaço insuficiente no cartão SD!</string> + <string name="toast_recorder_internal_error">Ocorreu um erro interno no gravador!</string> + <string name="toast_player_internal_error">Ocorreu um erro interno no leitor!</string> + <string name="toast_powerup_before_record_warning">Ligue primeiro o rádio FM!</string> + <string name="optmenu_record">Gravar FM</string> + <string name="btn_save_recording">Guardar</string> + <string name="btn_discard_recording">Rejeitar</string> + <string name="edit_recording_name_hint">Introduza aqui o nome do ficheiro</string> + <string name="dlg_save_recording_title">Guardar ficheiro de gravação</string> + <string name="dlg_save_recording_storage_warning">Espaço de armazenamento insuficiente! Deseja guardar a gravação actual?</string> + <string name="already_exists">já existe</string> + <string name="toast_invalid_frequency">Frequência inválida para local atual. Escopo de frequência válida: 87,5-108,0.</string> + <string name="toast_invalid_input">O último valor introduzido é inválido, o valor válido é 0 ou 5.</string> + <string name="toast_in_call">Não é possível utilizar o Rádio FM durante uma chamada.</string> + <string name="empty_list">A lista de canais está vazia.</string> + <string name="optmenu_speaker">"Altifalante"</string> + <string name="optmenu_earphone">Auricular</string> + <string name="not_available">Não disponível actualmente</string> + <string name="add_to_favorite1">Adicionar como canal predefinido</string> + <string name="contmenu_item_delete1">Remover de canais predefinidos</string> + <string name="dlg_delete_confirm_title1">Confirmar remoção de canais predefinidos</string> + <string name="dlg_delete_confirm_text1">Tem certeza que deseja remover este canal dos canais predefinidos?</string> + <string name="toast_favorite_full1">Impossível adicionar o canal à lista de canais predefinidos porque está cheia.</string> + <string name="toast_already_favorite1">Este canal já está na lista de canais predefinidos.</string> + <string name="toast_channel_deleted1">Removido com sucesso de canais predefinidos.</string> + <string name="toast_channel_added1">Adicionar om sucesso de canais predefinidos.</string> +</resources> + diff --git a/MediaTek/FmRadio/res/values-pt/strings.xml b/MediaTek/FmRadio/res/values-pt/strings.xml new file mode 100755 index 0000000..d2fc5ef --- /dev/null +++ b/MediaTek/FmRadio/res/values-pt/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Transmissão FM</string> + <string name="favorite_manager">Canais</string> + <string name="add_to_favorite">Adicionar aos Favoritos</string> + <string name="optmenu_search">Pesquisar</string> + <string name="optmenu_exit">Sair</string> + <string name="contmenu_title">Operações</string> + <string name="contmenu_item_edit">Editar</string> + <string name="contmenu_item_delete">Remover</string> + <string name="dlg_noantenna_text">Você precisa de um fone de ouvido como antena. Conecte seu fone de ouvido.</string> + <string name="dlg_noantenna_title">Conectar o fone de ouvido</string> + <string name="btn_yes">Sim</string> + <string name="btn_no">Não</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Cancelar</string> + <string name="dlg_progress_title">A procurar</string> + <string name="dlg_progress_text">procurar canais...</string> + <string name="dlg_addedit_station_name">Nome:</string> + <string name="dlg_addedit_station_freq">Frequencia:</string> + <string name="dlg_addedit_title_edit">Editar canal</string> + <string name="default_station_name">Novo canal</string> + <string name="dlg_delete_confirm_title">Confirmar Exclusão de Canal</string> + <string name="dlg_delete_confirm_text">Tem certeza de que deseja excluir este canal?</string> + <string name="toast_favorite_full">Impossível adicionar o canal para a lista de favoritos porque ela está cheia.</string> + <string name="toast_already_favorite">Este canal já está na lista de favoritos.</string> + <string name="toast_channel_deleted">O canal é excluído da lista de favoritos.</string> + <string name="toast_channel_added">O canal é adicionado para lista de favoritos.</string> + <string name="toast_channel_searched">Procurado nos canais disponíveis:</string> + <string name="toast_cannot_search">Impossível encontrar canal disponível.</string> + <string name="optmenu_rds_settings">Config. RDS</string> + <string name="dlg_rds_settings_channel_information">Info. do canal</string> + <string name="dlg_rds_settings_alternative_frequency">Freqüência alternativa</string> + <string name="more">Mais Aplicativos</string> + <string name="power">potência</string> + <string name="sound_mode">Modo de som</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Conecte seus fones de ouvido para usar como uma antena de rádio.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Substituir"</string> + <string name="fm_recorder_name">Gravador FM</string> + <string name="toast_recording_lost_warning">Sua gravação será perdida devido à removação do SD!</string> + <string name="toast_start_recording">Iniciar gravação…</string> + <string name="toast_sdcard_missing">Seu cartão SD está faltando!</string> + <string name="toast_sdcard_insufficient_space">Espaço insuficiente no cartão SD!</string> + <string name="toast_recorder_internal_error">Um erro interno ocorreu no gravador!</string> + <string name="toast_player_internal_error">Um erro interno ocorreu no reprodutor!</string> + <string name="toast_powerup_before_record_warning">Ligue FM primeiro!</string> + <string name="optmenu_record">Gravar FM</string> + <string name="btn_save_recording">Salvar</string> + <string name="btn_discard_recording">Descartar</string> + <string name="edit_recording_name_hint">Digite o nome do arquivo aqui</string> + <string name="dlg_save_recording_title">Salvar arquivo de gravação</string> + <string name="dlg_save_recording_storage_warning">Armazenamento insuficiente! Deseja salvar a gravação atual?</string> + <string name="already_exists">Já existe</string> + <string name="toast_invalid_frequency">Frequência inválida para a localização actual. Intervalo de frequências válidas: 87,5-108,0.</string> + <string name="toast_invalid_input">A última entrada inválida, valor válido é 0 ou 5.</string> + <string name="toast_in_call">Você não pode iniciar a Rádio FM quando esá er chamada.</string> + <string name="empty_list">Lista de canal está vazia.</string> + <string name="optmenu_speaker">"Alto-falante"</string> + <string name="optmenu_earphone">Headset</string> + <string name="not_available">Atualmente indisponível</string> + <string name="add_to_favorite1">Adicionar aos canais predefinidos</string> + <string name="contmenu_item_delete1">Remover dos canais predefinidos</string> + <string name="dlg_delete_confirm_title1">Confirmar a remoção dos canais predefinidos</string> + <string name="dlg_delete_confirm_text1">Deseja realmente remover este canal dos canais predefinidos?</string> + <string name="toast_favorite_full1">Não é possível adicionar o canal à lista de canais predefinidos porque a lista está cheia.</string> + <string name="toast_already_favorite1">Este canal já se encontra na lista de canais predefinidos.</string> + <string name="toast_channel_deleted1">Removido com sucesso dos canais predefinidos.</string> + <string name="toast_channel_added1">Adicionado com sucesso aos canais predefinidos.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-ro/strings.xml b/MediaTek/FmRadio/res/values-ro/strings.xml new file mode 100755 index 0000000..dfc986d --- /dev/null +++ b/MediaTek/FmRadio/res/values-ro/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Radio FM</string> + <string name="favorite_manager">Listă canale</string> + <string name="add_to_favorite">Adăugare la Preferinţe</string> + <string name="optmenu_search">Căutare</string> + <string name="optmenu_exit">Ieşire</string> + <string name="contmenu_title">Operaţii</string> + <string name="contmenu_item_edit">Editare</string> + <string name="contmenu_item_delete">Eliminare din preferinţe</string> + <string name="dlg_noantenna_text">Aveţi nevoie de căşti, acestea acţionând pe post de antenă. Conectaţi căştile.</string> + <string name="dlg_noantenna_title">Conectare căşti</string> + <string name="btn_yes">Da</string> + <string name="btn_no">Nu</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Revocare</string> + <string name="dlg_progress_title">Scanare</string> + <string name="dlg_progress_text">Scanare canale...</string> + <string name="dlg_addedit_station_name">Nume:</string> + <string name="dlg_addedit_station_freq">Frecvenţă:</string> + <string name="dlg_addedit_title_edit">Editare canal</string> + <string name="default_station_name">Canal nou</string> + <string name="dlg_delete_confirm_title">Confirmare eliminare din preferinţe</string> + <string name="dlg_delete_confirm_text">Sigur doriţi să eliminaţi acest canal din preferinţe?</string> + <string name="toast_favorite_full">Imposibil de adăugat canalul la lista de preferinţe deoarece aceasta este plină.</string> + <string name="toast_already_favorite">Canalul este deja în lista de preferinţe.</string> + <string name="toast_channel_deleted">Eliminarea din preferinţe a reuşit.</string> + <string name="toast_channel_added">Adăugarea la preferinţe a reuşit.</string> + <string name="toast_channel_searched">Canale disponibile căutate:</string> + <string name="toast_cannot_search">Imposibil de căutat canalul disponibil.</string> + <string name="toast_invalid_frequency">Frecvenţă nevalidă pentru locaţia curentă. Interval valid de frecvenţă: 87,5-108,0</string> + <string name="optmenu_rds_settings">Setări RDS</string> + <string name="dlg_rds_settings_channel_information">Informaţii canal</string> + <string name="dlg_rds_settings_alternative_frequency">Frecvenţă alternativă</string> + <string name="sound_mode">Mod sunet</string> + <string name="more">Mai multe aplicaţii</string> + <string name="power">putere</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Conectaţi căştile pentru că acestea funcţionează pe post de antenă radio.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Suprascrieţi"</string> + <string name="fm_recorder_name">Înregistrator FM</string> + <string name="toast_recording_lost_warning">Înregistrarea dvs. se va pierde din cauza scoaterii cartelei SD!</string> + <string name="toast_start_recording">Pornire înregistrare...</string> + <string name="toast_sdcard_missing">Cartela SD lipseşte!</string> + <string name="toast_sdcard_insufficient_space">Spaţiu insuficient pe cartela SD!</string> + <string name="toast_recorder_internal_error">S-a produs o eroare internă în înregistrator!</string> + <string name="toast_player_internal_error">S-a produs o eroare internă în player!</string> + <string name="toast_powerup_before_record_warning">Mai întâi porniţi radioul FM!</string> + <string name="optmenu_record">Înregistrare FM</string> + <string name="btn_save_recording">Salvare</string> + <string name="btn_discard_recording">Renunţare</string> + <string name="edit_recording_name_hint">Tastaţi numele de fişier aici</string> + <string name="dlg_save_recording_title">Salvare fişier de înregistrare</string> + <string name="dlg_save_recording_storage_warning">Spaţiu de stocare insuficient! Doriţi să salvaţi înregistrarea curentă?</string> + <string name="already_exists">există deja</string> + <string name="toast_invalid_input">Ultima intrare nevalidă, valoarea validă este 0 sau 5.</string> + <string name="toast_in_call">Nu puteţi lansa aplicaţia de radio FM cât timp vă aflaţi într-un apel.</string> + <string name="empty_list">Lista de canale este goală.</string> + <string name="optmenu_speaker">"Difuzor"</string> + <string name="optmenu_earphone">Set cu căşti</string> + <string name="not_available">Indisponibil în prezent</string> + <string name="add_to_favorite1">Adăugaţi la canalele presetate</string> + <string name="contmenu_item_delete1">Eliminaţi din canalele presetate</string> + <string name="dlg_delete_confirm_title1">Confirmaţi eliminarea din canalele presetate</string> + <string name="dlg_delete_confirm_text1">Sigur doriţi să eliminaţi acest canal din canalele presetate?</string> + <string name="toast_favorite_full1">Imposibil de adăugat canalul la lista de canale presetate deoarece aceasta este plină.</string> + <string name="toast_already_favorite1">Canalul este deja în lista de canale presetate.</string> + <string name="toast_channel_deleted1">Eliminarea din canalele presetate a reuşit.</string> + <string name="toast_channel_added1">Adăugarea la canalele presetate a reuşit.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-ru/strings.xml b/MediaTek/FmRadio/res/values-ru/strings.xml new file mode 100755 index 0000000..55d8e10 --- /dev/null +++ b/MediaTek/FmRadio/res/values-ru/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-станция</string> + <string name="favorite_manager">Список каналов</string> + <string name="add_to_favorite">Добавить в избранное</string> + <string name="optmenu_search">Поиск</string> + <string name="optmenu_exit">Выйти</string> + <string name="contmenu_title">Операции</string> + <string name="contmenu_item_edit">Изменить</string> + <string name="contmenu_item_delete">Удалить из избранного</string> + <string name="dlg_noantenna_text">Вам нужен головной телефон в роли антенны. Подключите головной телефон.</string> + <string name="dlg_noantenna_title">Подключите наушники</string> + <string name="btn_yes">Да </string> + <string name="btn_no">Нет</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Отменить</string> + <string name="dlg_progress_title">Сканирование</string> + <string name="dlg_progress_text">Поиск каналов...</string> + <string name="dlg_addedit_station_name">Имя:</string> + <string name="dlg_addedit_station_freq">Частота:</string> + <string name="dlg_addedit_title_edit">Изменить станция</string> + <string name="default_station_name">Новая станция</string> + <string name="dlg_delete_confirm_title">Подтвердите удаление канала</string> + <string name="dlg_delete_confirm_text">Действительно удалить этот канал?</string> + <string name="toast_favorite_full">Невозможно добавить канал в список избранных, поскольку список полон.</string> + <string name="toast_already_favorite">Этот канал уже добавлен в список избранных.</string> + <string name="toast_channel_deleted">Удалено из папки избранного.</string> + <string name="toast_channel_added">Добавлено в избранное.</string> + <string name="toast_channel_searched">Найденные доступные каналы:</string> + <string name="toast_cannot_search">Не удается найти доступный канал.</string> + <string name="optmenu_rds_settings">Настройки RDS</string> + <string name="dlg_rds_settings_channel_information">Информация о канале</string> + <string name="dlg_rds_settings_alternative_frequency">Альтернативная частота</string> + <string name="more">Еще приложения</string> + <string name="power">в степени</string> + <string name="sound_mode">Звуковой режим</string> + <string name="fm_unit">МГц</string> + <string name="no_antenna_info">Подключите наушники для использования в качестве антенны.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Перезаписать"</string> + <string name="fm_recorder_name">FM-рекордер</string> + <string name="toast_recording_lost_warning">Запись будет утеряна из-за извлечения SD-карты!</string> + <string name="toast_start_recording">Запуск записи…</string> + <string name="toast_sdcard_missing">Отсутствует SD-карта!</string> + <string name="toast_sdcard_insufficient_space">Недостаточно места на SD-карте!</string> + <string name="toast_recorder_internal_error">Внутренняя ошибка в устройстве записи!</string> + <string name="toast_player_internal_error">Внутренняя ошибка в плеере!</string> + <string name="toast_powerup_before_record_warning">Сначала включите FM-приемник!</string> + <string name="optmenu_record">Записать с FM-диапазона</string> + <string name="btn_save_recording">Сохранить</string> + <string name="btn_discard_recording">Аннулировать</string> + <string name="edit_recording_name_hint">Введите имя файла</string> + <string name="dlg_save_recording_title">Сохранить файл записи</string> + <string name="dlg_save_recording_storage_warning">Недостаточно памяти! Сохранить текущую запись?</string> + <string name="already_exists">Уже существует</string> + <string name="toast_invalid_frequency">Недопустимая частота для текущего положения. Диапазон допустимых частот: 87,5-108,0.</string> + <string name="toast_invalid_input">Последний неверный ввод, допустимое значение 0 или 5.</string> + <string name="toast_in_call">Во время вызова нельзя включить FM-радио.</string> + <string name="empty_list">Список каналов пуст.</string> + <string name="optmenu_speaker">"Динамик"</string> + <string name="optmenu_earphone">Наушники</string> + <string name="not_available">Недоступно в данный момент</string> + <string name="add_to_favorite1">Добавить в настроенные каналы</string> + <string name="contmenu_item_delete1">Удалить из настроенных каналов</string> + <string name="dlg_delete_confirm_title1">Подтвердить удаление из настроенных каналов</string> + <string name="dlg_delete_confirm_text1">Действительно удалить данный канал из настроенных каналов?</string> + <string name="toast_favorite_full1">Невозможно добавить данный канал в список настроенных каналов, так как список заполнен.</string> + <string name="toast_already_favorite1">Данный канал уже имеется в списке настроенных каналов.</string> + <string name="toast_channel_deleted1">Удалено из списка настроенных каналов.</string> + <string name="toast_channel_added1">Добавлено в список настроенных каналов.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-sk/strings.xml b/MediaTek/FmRadio/res/values-sk/strings.xml new file mode 100755 index 0000000..359146d --- /dev/null +++ b/MediaTek/FmRadio/res/values-sk/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Rádio FM</string> + <string name="favorite_manager">Zoznam kanálov</string> + <string name="add_to_favorite">Pridať do zoznamu obľúbených kanálov</string> + <string name="optmenu_search">Vyhľadať</string> + <string name="optmenu_exit">Ukončiť</string> + <string name="contmenu_title">Operácie</string> + <string name="contmenu_item_edit">Upraviť</string> + <string name="contmenu_item_delete">Odstrániť zo zoznamu obľúbených kanálov</string> + <string name="dlg_noantenna_text">Slúchadlá potrebujete ako anténu. Zapojte slúchadlá.</string> + <string name="dlg_noantenna_title">Zapojte slúchadlá</string> + <string name="btn_yes">"Áno"</string> + <string name="btn_no">"Nie"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Zrušiť </string> + <string name="dlg_progress_title">Vyhľadať</string> + <string name="dlg_progress_text">Vyhľadávam kanály...</string> + <string name="dlg_addedit_station_name">Názov:</string> + <string name="dlg_addedit_station_freq">Frekvencia:</string> + <string name="dlg_addedit_title_edit">Upraviť kanál</string> + <string name="default_station_name">Nový kanál</string> + <string name="dlg_delete_confirm_title">Potvrďte odstránenie zo zoznamu obľúbených kanálov</string> + <string name="dlg_delete_confirm_text">Ste si istí, že chcete odstrániť tento kanál zo zoznamu obľúbených kanálov?</string> + <string name="toast_favorite_full">Tento kanál nemožno pridať do zoznamu obľúbených kanálov, pretože je plný.</string> + <string name="toast_already_favorite">Tento kanál je už v zozname obľúbených kanálov.</string> + <string name="toast_channel_deleted">Kanál bol úspešne odstránený zo zoznamu obľúbených kanálov.</string> + <string name="toast_channel_added">Kanál bol úspešne pridaný do zoznamu obľúbených kanálov.</string> + <string name="toast_channel_searched">Vyhľadať dostupné kanály:</string> + <string name="toast_cannot_search">Dostupné kanály nemožno vyhľadať.</string> + <string name="toast_invalid_frequency">Neplatná frekvencia aktuálneho umiestnenia. Platí frekvenčný rozsah: 87,5 až 108,0</string> + <string name="toast_invalid_input">Naposledy zadaný vstup je neplatný. Platná hodnota je 0 alebo 5.</string> + <string name="optmenu_rds_settings">Nastavenia RDS</string> + <string name="dlg_rds_settings_channel_information">Informácie o kanále</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatívna frekvencia</string> + <string name="sound_mode">Režim zvuku</string> + <string name="more">"Viac"</string> + <string name="power">"mocnina"</string> + <string name="toast_in_call">Počas hovoru nemôžete spustiť rádio FM.</string> + <string name="empty_list">Zoznam kanálov je prázdny</string> + <string name="edit_frequency_overwrite_text">Prepísať</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Zapojte slúchadlá a používajte ako rádiovú anténu.</string> + <string name="fm_recorder_name">Nahrávač FM</string> + <string name="toast_recording_lost_warning">Keď vyberiete kartu SD, vaša nahrávka bude stratená!</string> + <string name="toast_start_recording">Spustiť nahrávanie...</string> + <string name="toast_sdcard_missing">Chýba vaša karta SD!</string> + <string name="toast_sdcard_insufficient_space">Nedostatok miesta na karte SD!</string> + <string name="toast_recorder_internal_error">Došlo k internej chybe v nahrávači!</string> + <string name="toast_player_internal_error">Došlo k internej chybe v prehrávači!</string> + <string name="toast_powerup_before_record_warning">Najskôr zapnite rádio FM!</string> + <string name="optmenu_record">Nahrať FM</string> + <string name="btn_save_recording">"Uložiť"</string> + <string name="btn_discard_recording">Vymazať</string> + <string name="edit_recording_name_hint">Sem napíšte názov súboru</string> + <string name="dlg_save_recording_title">Uložiť súbor s nahrávkou</string> + <string name="dlg_save_recording_storage_warning">V pamäti je nedostatok miesta! Chcete uložiť aktuálnu nahrávku?</string> + <string name="already_exists">už existuje</string> + <string name="optmenu_speaker">reproduktor</string> + <string name="optmenu_earphone">Slúchadlá</string> + <string name="not_available">Momentálne nie je k dispozícii</string> + <string name="add_to_favorite1">Pridať do prednastavených kanálov</string> + <string name="contmenu_item_delete1">Odstrániť z prednastavených kanálov</string> + <string name="dlg_delete_confirm_title1">Potvrďte odstránenie z prednastavených kanálov</string> + <string name="dlg_delete_confirm_text1">Ste si istí, že chcete odstrániť tento kanál z prednastavených kanálov?</string> + <string name="toast_favorite_full1">Tento kanál nemožno pridať do zoznamu prednastavených kanálov, pretože je plný.</string> + <string name="toast_already_favorite1">Tento kanál je už v zozname prednastavených kanálov.</string> + <string name="toast_channel_deleted1">Kanál bol úspešne odstránený zo zoznamu prednastavených kanálov.</string> + <string name="toast_channel_added1">Kanál bol úspešne pridaný do zoznamu prednastavených kanálov.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-sl/strings.xml b/MediaTek/FmRadio/res/values-sl/strings.xml new file mode 100755 index 0000000..460fe51 --- /dev/null +++ b/MediaTek/FmRadio/res/values-sl/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Radio FM</string> + <string name="dlg_progress_title">Iskanje</string> + <string name="btn_yes">Da</string> + <string name="optmenu_speaker">Zvočnik</string> + <string name="edit_frequency_overwrite_text">Prepiši</string> + <string name="toast_start_recording">Začetek snemanja ...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Seznam kanalov je prazen.</string> + <string name="optmenu_rds_settings">Nastavitve RDS</string> + <string name="toast_channel_searched">Najdeni razpoložljivi kanali:</string> + <string name="already_exists">že obstaja</string> + <string name="dlg_noantenna_title">Priklop slušalk</string> + <string name="add_to_favorite">Dodaj priljubljenim</string> + <string name="toast_sdcard_insufficient_space">Na kartici SD ni dovolj prostora!</string> + <string name="dlg_delete_confirm_title">Potrdi odstranitev iz priljubljenih</string> + <string name="optmenu_record">Snemanje FM</string> + <string name="optmenu_earphone">Slušalka</string> + <string name="sound_mode">Način zvoka</string> + <string name="toast_already_favorite">Ta kanal je že med priljubljenimi.</string> + <string name="not_available">Trenutno ni na voljo</string> + <string name="toast_channel_deleted">Uspešno odstranjeno iz priljubljenih</string> + <string name="toast_channel_added">Uspešno dodano priljubljenim.</string> + <string name="dlg_rds_settings_channel_information">Podatki o kanalu</string> + <string name="toast_favorite_full">Kanala ni mogoče dodati na seznam priljubljenih, ker je ta poln.</string> + <string name="btn_save_recording">Shrani</string> + <string name="optmenu_search">Išči</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativna frekvenca</string> + <string name="dlg_progress_text">Iskanje kanalov ...</string> + <string name="optmenu_exit">Izhod</string> + <string name="more">Več</string> + <string name="btn_discard_recording">Zavrzi</string> + <string name="contmenu_item_edit">Uredi</string> + <string name="toast_cannot_search">Iskanje razpoložljivih kanalov ni na voljo.</string> + <string name="dlg_save_recording_storage_warning">V pomnilniku ni dovolj prostora! Ali želite shraniti trenutni posnetek?</string> + <string name="toast_in_call">Radia FM ne morete zagnati, medtem ko imate klic.</string> + <string name="dlg_addedit_station_freq">Frekvenca:</string> + <string name="toast_recorder_internal_error">V snemalniku je prišlo do notranje napake!</string> + <string name="dlg_save_recording_title">Shrani posneto datoteko</string> + <string name="btn_ok">V redu</string> + <string name="power">Napajanje</string> + <string name="contmenu_item_delete">Odstrani iz priljubljenih</string> + <string name="toast_powerup_before_record_warning">Najprej napolnite FM!</string> + <string name="fm_recorder_name">Snemalnik FM</string> + <string name="toast_recording_lost_warning">Če odstranite SD, boste posnetek izgubili!</string> + <string name="dlg_delete_confirm_text">Ali ste prepričani, da želite ta kanal odstraniti iz priljubljenih?</string> + <string name="default_station_name">Nov kanal</string> + <string name="btn_cancel">Prekliči</string> + <string name="contmenu_title">Dejanja</string> + <string name="btn_no">Ne</string> + <string name="favorite_manager">Seznam kanalov</string> + <string name="toast_invalid_frequency">Neveljavna frekvenca za trenutno lokacijo. Veljaven frekvenčni razpon: 87,5–108,0</string> + <string name="toast_sdcard_missing">Kartica SD manjka!</string> + <string name="dlg_addedit_station_name">Ime:</string> + <string name="dlg_addedit_title_edit">Urejanje kanala</string> + <string name="toast_invalid_input">Zadnji neveljaven vnos, veljavna vrednost je 0 ali 5.</string> + <string name="edit_recording_name_hint">Sem vpišite ime datoteke</string> + <string name="dlg_noantenna_text">Slušalke rabite kot anteno. Priključite slušalke.</string> + <string name="toast_player_internal_error">V predvajalniku je prišlo do notranje napake!</string> + <string name="no_antenna_info">Priključite slušalke, da bodo služile kot antena radia.</string> + <string name="add_to_favorite1">Dodaj med prednastavljene kanale</string> + <string name="contmenu_item_delete1">Odstrani iz prednastavljenih kanalov</string> + <string name="dlg_delete_confirm_title1">Potrdi odstranitev iz prednastavljenih kanalov</string> + <string name="dlg_delete_confirm_text1">Ali ste prepričani, da želite odstraniti ta kanal iz prednastavljenih kanalov?</string> + <string name="toast_favorite_full1">Kanala ni mogoče dodati na seznam prednastavljenih kanalov, ker je seznam poln.</string> + <string name="toast_already_favorite1">Ta kanal je že na seznamu prednastavljenih kanalov.</string> + <string name="toast_channel_deleted1">Uspešno odstranjeno iz prednastavljenih kanalov.</string> + <string name="toast_channel_added1">Uspešno dodano med prednastavljene kanale.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-sr/strings.xml b/MediaTek/FmRadio/res/values-sr/strings.xml new file mode 100755 index 0000000..bccb8e8 --- /dev/null +++ b/MediaTek/FmRadio/res/values-sr/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">FM радио</string> + <string name="dlg_progress_title">Претрага</string> + <string name="btn_yes">Да</string> + <string name="optmenu_speaker">Звучник</string> + <string name="edit_frequency_overwrite_text">Замени</string> + <string name="toast_start_recording">Почни снимање...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Листа канала је празна.</string> + <string name="optmenu_rds_settings">Подешавања RDS</string> + <string name="toast_channel_searched">Претрага доступних канала:</string> + <string name="already_exists">већ постоји</string> + <string name="dlg_noantenna_title">Укључите слушалицу</string> + <string name="add_to_favorite">Листа канала</string> + <string name="toast_sdcard_insufficient_space">Недовољан простор на SD картици!</string> + <string name="dlg_delete_confirm_title">Потврди уклањање из омиљених</string> + <string name="optmenu_record">Сними FM</string> + <string name="optmenu_earphone">Слушалица</string> + <string name="sound_mode">Режим звука</string> + <string name="toast_already_favorite">Овај канал је већ на листи омиљених.</string> + <string name="not_available">Тренутно није доступно</string> + <string name="toast_channel_deleted">Успешно уклоњено из омиљених.</string> + <string name="toast_channel_added">Успешно додато омиљеним.</string> + <string name="dlg_rds_settings_channel_information">Информације о каналу</string> + <string name="toast_favorite_full">Није могуће додати канал на листу омиљених зато што је листа пуна.</string> + <string name="btn_save_recording">Сачувај</string> + <string name="optmenu_search">Претрага</string> + <string name="dlg_rds_settings_alternative_frequency">Алтернативна фреквенција</string> + <string name="dlg_progress_text">Претрага канала...</string> + <string name="optmenu_exit">Изађи</string> + <string name="more">Још</string> + <string name="btn_discard_recording">Одбаци</string> + <string name="contmenu_item_edit">Уреди</string> + <string name="toast_cannot_search">Није могуће тражити доступни канал.</string> + <string name="dlg_save_recording_storage_warning">Недовољна меморија! Желите ли да снимите тренутни снимак?</string> + <string name="toast_in_call">За време позива покретање FM радија није могуће.</string> + <string name="dlg_addedit_station_freq">Име:</string> + <string name="toast_recorder_internal_error">Дошло је до интерне грешке у снимачу!</string> + <string name="dlg_save_recording_title">Сачувај датотеку снимања</string> + <string name="btn_ok">Потврди</string> + <string name="power">Напајање</string> + <string name="contmenu_item_delete">Уклони из омиљених</string> + <string name="toast_powerup_before_record_warning">Прво укључите FM!</string> + <string name="fm_recorder_name">FM снимач</string> + <string name="toast_recording_lost_warning">Ваш снимак ће бити изгубљен због уклањања SD картице!</string> + <string name="dlg_delete_confirm_text">Желите ли сигурно да уклоните овај канал из омиљених?</string> + <string name="default_station_name">Нови канали</string> + <string name="btn_cancel">Откажи</string> + <string name="contmenu_title">Операције</string> + <string name="btn_no">Не</string> + <string name="favorite_manager">Листа канала</string> + <string name="toast_invalid_frequency">Неважећа фреквенција за тренутну локацију. Опсег важеће фреквенције: 87,5-108,0</string> + <string name="toast_sdcard_missing">Ваша SD картица недостаје!</string> + <string name="dlg_addedit_station_name">Повезивање:</string> + <string name="dlg_addedit_title_edit">Уреди канал</string> + <string name="toast_invalid_input">Последњи неважећи унос, важећа вредност је 0 или 5.</string> + <string name="edit_recording_name_hint">Овде укуцајте име датотеке</string> + <string name="dlg_noantenna_text">Потребна вам је слушалица као антена. Укључите слушалицу.</string> + <string name="toast_player_internal_error">Дошло је до интерне грешке у плејеру!</string> + <string name="no_antenna_info">Укључите слушалице да бисте их користили као радио антену</string> + <string name="add_to_favorite1">Додај унапред подешеним каналима</string> + <string name="contmenu_item_delete1">Уклони из унапред подешених канала</string> + <string name="dlg_delete_confirm_title1">Потврди уклањање из унапред подешених канала</string> + <string name="dlg_delete_confirm_text1">Желите ли сигурно да уклоните овај канал из унапред подешених канала?</string> + <string name="toast_favorite_full1">Није могуће додати канал на листу унапред подешених канала зато што је листа пуна.</string> + <string name="toast_already_favorite1">Овај канал је већ на листи унапред подешених.</string> + <string name="toast_channel_deleted1">Успешно уклоњено из унапред подешених канала.</string> + <string name="toast_channel_added1">Успешно додато унапред подешеним каналима.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-sv/strings.xml b/MediaTek/FmRadio/res/values-sv/strings.xml new file mode 100755 index 0000000..adc6834 --- /dev/null +++ b/MediaTek/FmRadio/res/values-sv/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-radio</string> + <string name="favorite_manager">Kanallista</string> + <string name="add_to_favorite">Lägg till som favorit</string> + <string name="optmenu_search">Sök</string> + <string name="optmenu_exit">Avsluta</string> + <string name="contmenu_title">Användning</string> + <string name="contmenu_item_edit">Redigera</string> + <string name="contmenu_item_delete">Ta bort från favoriter</string> + <string name="dlg_noantenna_text">Du behöver en hörlur som antenn. Anslut dina hörlurar.</string> + <string name="dlg_noantenna_title">Anslut hörlurar</string> + <string name="btn_yes">"Ja"</string> + <string name="btn_no">"Nej"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Avbryt</string> + <string name="dlg_progress_title">Sök</string> + <string name="dlg_progress_text">Sök kanaler…</string> + <string name="dlg_addedit_station_name">Namn:</string> + <string name="dlg_addedit_station_freq">Frekvens:</string> + <string name="dlg_addedit_title_edit">Redigera kanal</string> + <string name="default_station_name">Ny kanal</string> + <string name="dlg_delete_confirm_title">Bekräfta borttagning från favoriter</string> + <string name="dlg_delete_confirm_text">Är du säker på att du vill ta bort den här kanalen från favoriter?</string> + <string name="toast_favorite_full">Kan inte lägga till kanalen i favoritlistan eftersom den är full.</string> + <string name="toast_already_favorite">Denna kanal finns redan i favoritlistan.</string> + <string name="toast_channel_deleted">Kanalen har tagits bort från favoriter.</string> + <string name="toast_channel_added">Kanalen har lagts till i favoriter.</string> + <string name="toast_channel_searched">Tillgängliga kanaler efter sökning:</string> + <string name="toast_cannot_search">Kan inte söka efter tillgängliga kanaler.</string> + <string name="toast_invalid_frequency">Ogiltig frekvens för nuvarande plats. Giltigt frekvensområde: 87,5-108,0</string> + <string name="toast_invalid_input">Senast ogitliga inmatning, aktivt värde är 0 eller 5.</string> + <string name="optmenu_rds_settings">RDS-inställningar</string> + <string name="dlg_rds_settings_channel_information">Kanalinformation</string> + <string name="dlg_rds_settings_alternative_frequency">Alternativ frekvens</string> + <string name="sound_mode">Ljudläge</string> + <string name="more">"Mer"</string> + <string name="power">"exponent"</string> + <string name="toast_in_call">Du kan inte starta FM-radio när ett samtal pågår.</string> + <string name="empty_list">Kanallistan är tom.</string> + <string name="edit_frequency_overwrite_text">Skriv över</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Anslut dina hörlurar för användning som radioantenn.</string> + <string name="fm_recorder_name">FM-inspelare</string> + <string name="toast_recording_lost_warning">Inspelningen kommer att tappas eftersom SD-kortet borttagning!</string> + <string name="toast_start_recording">Starta inspelning…</string> + <string name="toast_sdcard_missing">SD-kortet saknas!</string> + <string name="toast_sdcard_insufficient_space">Inte tillräckligt med ledigt utrymme på SD-kortet!</string> + <string name="toast_recorder_internal_error">Ett internt fel har inträffat i inspelaren!</string> + <string name="toast_player_internal_error">Ett internt fel har inträffat i spelaren!</string> + <string name="toast_powerup_before_record_warning">Starta FM först!</string> + <string name="optmenu_record">Spela in FM</string> + <string name="btn_save_recording">"Spara"</string> + <string name="btn_discard_recording">Kasta bort</string> + <string name="edit_recording_name_hint">Ange filnamnet här</string> + <string name="dlg_save_recording_title">Spara inspelad fil</string> + <string name="dlg_save_recording_storage_warning">Otillräckligt utrymme! Vill du spara befintlig inspelning?</string> + <string name="already_exists">finns redan</string> + <string name="optmenu_speaker">Högtalare</string> + <string name="optmenu_earphone">hörlur</string> + <string name="not_available">Inte tillgänglig för närvarande</string> + <string name="add_to_favorite1">Lägg till i förinställda kanaler</string> + <string name="contmenu_item_delete1">Ta bort från förinställda kanaler</string> + <string name="dlg_delete_confirm_title1">Bekräfta borttagning från förinställda kanaler</string> + <string name="dlg_delete_confirm_text1">Är du säker på att du vill ta bort den här kanalen från förinställda kanaler?</string> + <string name="toast_favorite_full1">Kan inte lägga till kanalen i listan över förinställda kanaler eftersom den är full.</string> + <string name="toast_already_favorite1">Denna kanal finns redan i listan över förinställda kanaler.</string> + <string name="toast_channel_deleted1">Kanalen har tagits bort från förinställda kanaler.</string> + <string name="toast_channel_added1">Kanalen har lagts till i förinställda kanaler.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-sw/strings.xml b/MediaTek/FmRadio/res/values-sw/strings.xml new file mode 100755 index 0000000..4d5ae7a --- /dev/null +++ b/MediaTek/FmRadio/res/values-sw/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Redio ya FM</string> + <string name="dlg_progress_title">Tafuta</string> + <string name="btn_yes">Ndiyo</string> + <string name="optmenu_speaker">Spika</string> + <string name="edit_frequency_overwrite_text">Andika juu</string> + <string name="toast_start_recording">Anza kurekodi…</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Orodha ya vituo iko tupu.</string> + <string name="optmenu_rds_settings">Mipangilio ya RDS</string> + <string name="toast_channel_searched">Vituo vinavyopatikana vilivyotafutwa:</string> + <string name="already_exists">tayari ipo</string> + <string name="dlg_noantenna_title">Vaa vifaa vya masikioni</string> + <string name="add_to_favorite">Ongeza kwa Kipendwa</string> + <string name="toast_sdcard_insufficient_space">Nafasi ya kadi ya SD haitoshi!</string> + <string name="dlg_delete_confirm_title">Thibitisha ondoa kutoka kwenye vipendwa</string> + <string name="optmenu_record">Rekodi FM</string> + <string name="optmenu_earphone">Kifaa cha masikio</string> + <string name="sound_mode">Hali ya sauti</string> + <string name="toast_already_favorite">Kituo hiki kiko tayari katika orodha ya vipendwa.</string> + <string name="not_available">Haipatikani kwa sasa</string> + <string name="toast_channel_deleted">Imefanikiwa kuondolewa kwenye vipendwa.</string> + <string name="toast_channel_added">Imefanikiwa kuongezwa kwenye vipendwa.</string> + <string name="dlg_rds_settings_channel_information">Maelezo ya kituto</string> + <string name="toast_favorite_full">Haiwezi kuongeza kituo kwenye orodha ya vipendwa kwa sababu imejaa.</string> + <string name="btn_save_recording">Hifadhi</string> + <string name="optmenu_search">Tafuta</string> + <string name="dlg_rds_settings_alternative_frequency">Masafa mbadala</string> + <string name="dlg_progress_text">Tafuta vituo…</string> + <string name="optmenu_exit">Toka</string> + <string name="more">Zaidi</string> + <string name="btn_discard_recording">Tupa</string> + <string name="contmenu_item_edit">Hariri</string> + <string name="toast_cannot_search">Haiwezi kutafuta kituo kinachopatikana.</string> + <string name="dlg_save_recording_storage_warning">Hifadhi haitoshi! Je, unataka kuhifadhi rekodi ya sasa?</string> + <string name="toast_in_call">Huwezi kuzindua Redio ya FM unapopiga simu.</string> + <string name="dlg_addedit_station_freq">Masafa:</string> + <string name="toast_recorder_internal_error">Hitilafu ya ndani imetokea katika rekoda!</string> + <string name="dlg_save_recording_title">Hifadhi faili ya rekodi</string> + <string name="btn_ok">Sawa</string> + <string name="power">Nishati</string> + <string name="contmenu_item_delete">Ondoa kwenye vipendwa</string> + <string name="toast_powerup_before_record_warning">Tafadhali washa FM kwanza!</string> + <string name="fm_recorder_name">Rekoda ya FM</string> + <string name="toast_recording_lost_warning">Rekodi yako itapotea kwa sababu ya uondoaji SD!</string> + <string name="dlg_delete_confirm_text">Je, una uhakika unataka kuondoa kituo hiki kutoka kwa vipendwa?</string> + <string name="default_station_name">Kituo Kipya</string> + <string name="btn_cancel">Ghairi</string> + <string name="contmenu_title">Shughuli</string> + <string name="btn_no">La</string> + <string name="favorite_manager">Orodha ya vituo</string> + <string name="toast_invalid_frequency">Masafa ya eneo la sasa sio sahihi. Upeo wa masafa sahihi: 87.5-108.0</string> + <string name="toast_sdcard_missing">Kadi yako ya SD inakosekana!</string> + <string name="dlg_addedit_station_name">Jina:</string> + <string name="dlg_addedit_title_edit">Hariri Kituo</string> + <string name="toast_invalid_input">Ingizo la mwisho lisilo halali, thamani halali ni 0 au 5.</string> + <string name="edit_recording_name_hint">Charaza jina la faili hapa</string> + <string name="dlg_noantenna_text">Unahitaji kifaa cha masikio kama antena. Tafadhali chopeka kifaa chako cha masikio.</string> + <string name="toast_player_internal_error">Hitilafu ya kindani imetokea katika kichezaji!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-th/strings.xml b/MediaTek/FmRadio/res/values-th/strings.xml new file mode 100755 index 0000000..916fe97 --- /dev/null +++ b/MediaTek/FmRadio/res/values-th/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">วิทยุ FM</string> + <string name="favorite_manager">รายการสถานี</string> + <string name="add_to_favorite">เพิ่มลงในรายการโปรด</string> + <string name="optmenu_search">ค้นหา</string> + <string name="optmenu_exit">ออก</string> + <string name="contmenu_title">การใช้งาน</string> + <string name="contmenu_item_edit">แก้ไข</string> + <string name="contmenu_item_delete">ลบออกจากรายการที่ชอบ</string> + <string name="dlg_noantenna_text">คุณจำเป็นต้องมีหูฟังเพื่อใช้เป็นเสาอากาศ โปรดเสียบหูฟังของคุณ</string> + <string name="dlg_noantenna_title">เสียบหูฟัง</string> + <string name="btn_yes">"ใช่"</string> + <string name="btn_no">"ไม่"</string> + <string name="btn_ok">ตกลง</string> + <string name="btn_cancel">ยกเลิก</string> + <string name="dlg_progress_title">ค้นหา</string> + <string name="dlg_progress_text">ค้นหาสถานี...</string> + <string name="dlg_addedit_station_name">ชื่อ:</string> + <string name="dlg_addedit_station_freq">ความถี่:</string> + <string name="dlg_addedit_title_edit">แก้ไขแชนเนล</string> + <string name="default_station_name">สถานีใหม่</string> + <string name="dlg_delete_confirm_title">ยืนยันการลบ ช่อง</string> + <string name="dlg_delete_confirm_text">แน่ใจหรือไม่ว่าคุณต้องการลบช่องนี้?</string> + <string name="toast_favorite_full">ไม่สามารถเพิ่มช่องไปยังรายการโปรดได้ เนื่องจากรายการเต็ม</string> + <string name="toast_already_favorite">ช่องนี้อยู่ในรายการโปรดอยู่แล้ว</string> + <string name="toast_channel_deleted">ลบออกจากรายการที่ชอบสำเร็จแล้ว</string> + <string name="toast_channel_added">เพิ่มลงในรายการที่ชอบสำเร็จแล้ว</string> + <string name="toast_channel_searched">ค้นหาจากแชนเนลที่มี:</string> + <string name="toast_cannot_search">ไม่สามารถค้นหาจากแชนเนลที่มี</string> + <string name="optmenu_rds_settings">การตั้งค่า RDS</string> + <string name="dlg_rds_settings_channel_information">ข้อมูลแชนเนล</string> + <string name="dlg_rds_settings_alternative_frequency">ความถี่ทางเลือก</string> + <string name="more">เพิ่มเติม</string> + <string name="power">เปิด/ปิด</string> + <string name="sound_mode">โหมดเสียง</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">เสียบหูฟังเพื่อใช้เป็น เสาอากาศวิทยุ</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"เขียนทับ"</string> + <string name="fm_recorder_name">บันทึกเสียงวิทยุ</string> + <string name="toast_recording_lost_warning">การบันทึกของคุณจะหายไปเนื่องจากการถอด SD ออก!</string> + <string name="toast_start_recording">เริ่มบันทึกเสียง</string> + <string name="toast_sdcard_missing">การ์ด SD ของคุณหายไป</string> + <string name="toast_sdcard_insufficient_space">มีเนื้อที่ว่างในการ์ด SD ไม่เพียงพอ!</string> + <string name="toast_recorder_internal_error">เกิดความผิดพลาดภายในในตัวเครื่องบันทึก!</string> + <string name="toast_player_internal_error">เกิดความผิดพลาดภายในในตัวเครื่องเล่น!</string> + <string name="toast_powerup_before_record_warning">ขั้นแรกกรุณาเปิด FM!</string> + <string name="optmenu_record">บันทึกเสียงวิทยุ</string> + <string name="btn_save_recording">บันทึก</string> + <string name="btn_discard_recording">ยกเลิก</string> + <string name="edit_recording_name_hint">พิมพ์ชื่อไฟล์ที่นี่</string> + <string name="dlg_save_recording_title">บันทึกไฟล์อัดเสียง</string> + <string name="dlg_save_recording_storage_warning">มีเนื้อที่เก็บไม่เพียงพอ! คุณต้องการบันทึกการบันทึกปัจจุบันหรือไม่</string> + <string name="already_exists">มีอยู่แล้ว</string> + <string name="toast_invalid_frequency">ความถี่ใช้ไม่ได้สำหรับที่ตั้งปัจจุบัน ช่วงความถี่ที่ใช้ได้: 87.5-108.0.</string> + <string name="toast_invalid_input">ข้อมูลที่ป้อนล่าสุดไม่ถูกต้อง ค่าที่ถูกต้องคือ 0 หรือ 5</string> + <string name="toast_in_call">คุณไม่สามารถเปิดใช้งานวิทยุเอฟเอ็มได้เมื่อคุณกำลังโทร</string> + <string name="empty_list">รายการสถานีว่างอยู่</string> + <string name="optmenu_speaker">"ลำโพง"</string> + <string name="optmenu_earphone">หูฟัง</string> + <string name="not_available">ขณะนี้ใช้ไม่ได้</string> + <string name="add_to_favorite1">เพิ่มลงในช่องที่ตั้งไว้</string> + <string name="contmenu_item_delete1">ลบออกจากช่องที่ตั้งไว้</string> + <string name="dlg_delete_confirm_title1">ยืนยันการลบออกจากช่องที่ตั้งไว้</string> + <string name="dlg_delete_confirm_text1">คุณแน่ใจว่าต้องการลบช่องนี้ออกจากช่องที่ตั้งไว้หรือไม่</string> + <string name="toast_favorite_full1">ไม่สามารถเพิ่มช่องลงในรายการช่องที่ตั้งไว้ได้ เนื่องจากรายการเต็ม</string> + <string name="toast_already_favorite1">ช่องนี้มีอยู่ในรายการช่องที่ตั้งไว้แล้ว</string> + <string name="toast_channel_deleted1">ลบออกจากช่องที่ตั้งไว้สำเร็จแล้ว</string> + <string name="toast_channel_added1">เพิ่มลงในช่องที่ตั้งไว้สำเร็จแล้ว</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-tl/strings.xml b/MediaTek/FmRadio/res/values-tl/strings.xml new file mode 100755 index 0000000..3509ba6 --- /dev/null +++ b/MediaTek/FmRadio/res/values-tl/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">DM Radyo</string> + <string name="favorite_manager">Listahan ng channel</string> + <string name="add_to_favorite">Magdagdag sa Paborito</string> + <string name="optmenu_search">Maghanap</string> + <string name="optmenu_exit">Lumabas</string> + <string name="contmenu_title">Mga Operasyon</string> + <string name="contmenu_item_edit">I-edit</string> + <string name="contmenu_item_delete">Alisin mula sa mga paborito</string> + <string name="dlg_noantenna_text">Kailangan mo ng earphone bilang antenna. Pakisaksak ang earphone mo.</string> + <string name="dlg_noantenna_title">Isaksak ang earphone</string> + <string name="btn_yes">Oo</string> + <string name="btn_no">Wala</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Kanselahin</string> + <string name="dlg_progress_title">I-scan</string> + <string name="dlg_progress_text">Hanapan ang mga channerl…</string> + <string name="dlg_addedit_station_name">Pangalan:</string> + <string name="dlg_addedit_station_freq">Dalas:</string> + <string name="dlg_addedit_title_edit">I-edit ang Channel</string> + <string name="default_station_name">Bagong Channel</string> + <string name="dlg_delete_confirm_title">Kumpirmahin ang pag-alis mula sa mga paborito</string> + <string name="dlg_delete_confirm_text">Sigurado ka bang nais mong alisin ang channel na ito mula sa mga paborito?</string> + <string name="toast_favorite_full">Hindi maidagdag ang channel sa listahan ng paborito dahil puno na ito.</string> + <string name="toast_already_favorite">Nasa listahan na ng paborito ang channel na ito.</string> + <string name="toast_channel_deleted">Tagumpay na inalis mula sa mga paborito.</string> + <string name="toast_channel_added">Tagumpay na naidagdag sa mga paborito.</string> + <string name="toast_channel_searched">Hinanapan ang mga magagamit na channel.</string> + <string name="toast_cannot_search">Hindi mahanap ang magagamit na channel.</string> + <string name="toast_invalid_frequency">Hindi balidong frequency para sa kasalukuyang lokasyon. Sakop ng balidong frequency: 87.5-108.0.</string> + <string name="optmenu_rds_settings">Mga RDS na setting</string> + <string name="dlg_rds_settings_channel_information">Impormasyon sa channel</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatibong frequency</string> + <string name="sound_mode">Mode ng tunog</string> + <string name="more">Marami Pang Apps</string> + <string name="power">power</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">I-plug ang earphones mo para gamitin bilang antenna ng radyo.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"I-overwrite"</string> + <string name="fm_recorder_name">FM na recorder</string> + <string name="toast_recording_lost_warning">Ang recording mo ay mawawala dahil sa pagtanggal ng SD!</string> + <string name="toast_start_recording">Simulan ang pag-record…</string> + <string name="toast_sdcard_missing">Nawawala ang SD card mo!</string> + <string name="toast_sdcard_insufficient_space">Hindi sapat na espasyo ng SD card!</string> + <string name="toast_recorder_internal_error">May panloob na error na naganap sa recorder!</string> + <string name="toast_player_internal_error">May panloob na error na naganap sa player!</string> + <string name="toast_powerup_before_record_warning">Paki-paganahin muna ang FM!</string> + <string name="optmenu_record">I-record ang FM</string> + <string name="btn_save_recording">I-save</string> + <string name="btn_discard_recording">Itapon</string> + <string name="edit_recording_name_hint">I-type ang pangalan ng file dito</string> + <string name="dlg_save_recording_title">I-save ang file ng recording</string> + <string name="dlg_save_recording_storage_warning">Hindi sapat ang imbakan! Gusto mo bang i-save ang kasalukuyang recording?</string> + <string name="already_exists">umiiral na</string> + <string name="toast_invalid_input">Ang huling hindi balidong input, balidong halaga ay 0 o 5.</string> + <string name="toast_in_call">Hindi mo maila-launch ang FM Radio kapag nasa tawag ka.</string> + <string name="empty_list">Walang laman ang listahan ng channel.</string> + <string name="optmenu_speaker">"Speaker"</string> + <string name="optmenu_earphone">Headset</string> + <string name="not_available">Kasalukuyang hindi magagamit</string> + <string name="add_to_favorite1">Idagdag sa mga naka-set anng channel</string> + <string name="contmenu_item_delete1">Alisin mula sa mga naka-set nang channel</string> + <string name="dlg_delete_confirm_title1">Kumpirmahin ang pag-alis mula sa mga naka-set nang channel</string> + <string name="dlg_delete_confirm_text1">Sigurado ka bang gusto mong alisin ang channel na ito mula sa mga preset na channel?</string> + <string name="toast_favorite_full1">Hindi maidagdag ang channel sa listahan na preset dahil puno na ito.</string> + <string name="toast_already_favorite1">Nasa listahan na ng preset na channel ang channel na ito.</string> + <string name="toast_channel_deleted1">Tagumpay na inalis mula sa mga naka-set nang channel.</string> + <string name="toast_channel_added1">Tagumpay na idinagdag mula sa mga naka-set nang channel.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-tr/strings.xml b/MediaTek/FmRadio/res/values-tr/strings.xml new file mode 100755 index 0000000..800f5f6 --- /dev/null +++ b/MediaTek/FmRadio/res/values-tr/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM Radyo</string> + <string name="favorite_manager">Kanal listesi</string> + <string name="add_to_favorite">Sık Kullanılanlara Ekle</string> + <string name="optmenu_search">Ara</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">İşlemler</string> + <string name="contmenu_item_edit">Düzenle</string> + <string name="contmenu_item_delete">Sık kullanılanlardan kaldır</string> + <string name="dlg_noantenna_text">Anten işlevi için bir kulaklık gerekiyor. Lütfen kulaklığınızı takın.</string> + <string name="dlg_noantenna_title">Kulaklığı takın</string> + <string name="btn_yes">Evet</string> + <string name="btn_no">Hayır</string> + <string name="btn_ok">Tamam</string> + <string name="btn_cancel">İptal</string> + <string name="dlg_progress_title">Tara</string> + <string name="dlg_progress_text">Kanalları ara…</string> + <string name="dlg_addedit_station_name">Ad:</string> + <string name="dlg_addedit_station_freq">Sıklık:</string> + <string name="dlg_addedit_title_edit">Kanalı Düzenle</string> + <string name="default_station_name">Yeni Kanal</string> + <string name="dlg_delete_confirm_title">Kanal Silme İşlemini Onayla</string> + <string name="dlg_delete_confirm_text">Bu kanalı silmek istediğinizden emin misiniz?</string> + <string name="toast_favorite_full">Sık kullanılanlar listesi dolu olduğu için listeye kanal eklenemiyor.</string> + <string name="toast_already_favorite">Bu kanal zaten sık kullanılanlar listesinde.</string> + <string name="toast_channel_deleted">Sık kullanılanlardan başarıyla kaldır.</string> + <string name="toast_channel_added">Sık kullanılanlara başarıyla eklendi.</string> + <string name="toast_channel_searched">Uygun kanallar bulundu:</string> + <string name="toast_cannot_search">Uygun kanal bulunamıyor.</string> + <string name="optmenu_rds_settings">RDS ayarları</string> + <string name="dlg_rds_settings_channel_information">Kanal bilgileri</string> + <string name="dlg_rds_settings_alternative_frequency">Alternatif frekans</string> + <string name="more">Diğer Uyg</string> + <string name="sound_mode">Ses modu</string> + <string name="power">üstü</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Radyo anteni olarak kullanmak için kulaklıklarınızı takın.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Üzerine yaz"</string> + <string name="fm_recorder_name">FM kaydedici</string> + <string name="toast_recording_lost_warning">SD çıkarıldığı için kaydınız kaybolacak!</string> + <string name="toast_start_recording">Kayıdı başla…</string> + <string name="toast_sdcard_missing">SD kartınız yok!</string> + <string name="toast_sdcard_insufficient_space">Yetersiz SD kartı alanı!</string> + <string name="toast_recorder_internal_error">Kayıt cihazında dahili hata oluştu!</string> + <string name="toast_player_internal_error">Müzik çalarda dahili hata oluştu!</string> + <string name="toast_powerup_before_record_warning">"Lütfen ilk önce FM'i açın!"</string> + <string name="optmenu_record">"FM'i kaydet"</string> + <string name="btn_save_recording">Kaydet</string> + <string name="btn_discard_recording">Çıkar</string> + <string name="edit_recording_name_hint">Dosya adını buraya yazın</string> + <string name="dlg_save_recording_title">Kayıt dosyasını kaydet</string> + <string name="dlg_save_recording_storage_warning">Yetersiz depolama alanı! Mevcut kaydı kaydetmek istiyor musunuz?</string> + <string name="already_exists">Zaten var</string> + <string name="toast_invalid_frequency">Şu anki konum için geçersiz frekans. Geçerli frekans aralığı: 87,5 - 108,0.</string> + <string name="toast_invalid_input">"En son geçersiz giriş, geçersiz değer 0 veya 5'dir."</string> + <string name="toast_in_call">"Görüşme sırasında FM Radyo'yu başlatmazsınız."</string> + <string name="empty_list">Kanal listesi boş.</string> + <string name="optmenu_speaker">"Hoparlör"</string> + <string name="optmenu_earphone">Kulaklık</string> + <string name="not_available">Şu anda kullanılamaz</string> + <string name="add_to_favorite1">Önceden ayarlanmış kanallara ekle</string> + <string name="contmenu_item_delete1">Önceden ayarlanmış kanallardan sil</string> + <string name="dlg_delete_confirm_title1">Önceden ayarlanmış kanallardan silmeyi onayla</string> + <string name="dlg_delete_confirm_text1">Bu kanalı önceden ayarlanmış kanallar arasından silmek istediğinizden emin misiniz?</string> + <string name="toast_favorite_full1">Önceden ayarlanmış kanal listesi dolu olduğundan kanal eklenemiyor.</string> + <string name="toast_already_favorite1">Bu kanal zaten önceden ayarlanmış kanal listesinde var.</string> + <string name="toast_channel_deleted1">Önceden ayarlanmış kanallardan başarıyla silindi.</string> + <string name="toast_channel_added1">Önceden ayarlanmış kanallara başarıyla eklendi.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-uk/strings.xml b/MediaTek/FmRadio/res/values-uk/strings.xml new file mode 100755 index 0000000..7a8678a --- /dev/null +++ b/MediaTek/FmRadio/res/values-uk/strings.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM-радіо</string> + <string name="favorite_manager">Список каналів</string> + <string name="add_to_favorite">Додати до улюбленого</string> + <string name="optmenu_search">Пошук</string> + <string name="optmenu_exit">Вихід</string> + <string name="contmenu_title">Операції</string> + <string name="contmenu_item_edit">Редагувати</string> + <string name="contmenu_item_delete">Видалити з улюбленого</string> + <string name="dlg_noantenna_text">Навушники потрібні як антена. Будь ласка, підключіть навушники.</string> + <string name="dlg_noantenna_title">Увімкніть навушники</string> + <string name="btn_yes">"Так"</string> + <string name="btn_no">"Ні"</string> + <string name="btn_ok">ОК</string> + <string name="btn_cancel">Скасувати</string> + <string name="dlg_progress_title">Пошук</string> + <string name="dlg_progress_text">Пошук каналів...</string> + <string name="dlg_addedit_station_name">Назва:</string> + <string name="dlg_addedit_station_freq">Частота:</string> + <string name="dlg_addedit_title_edit">Редагувати канал</string> + <string name="default_station_name">Новий канал</string> + <string name="dlg_delete_confirm_title">Підтвердити видалення з улюбленого</string> + <string name="dlg_delete_confirm_text">Точно видалити цей канал з улюблених?</string> + <string name="toast_favorite_full">Неможливо додати канал до списку улюблених: він повний.</string> + <string name="toast_already_favorite">Цей канал вже у списку улюбленого.</string> + <string name="toast_channel_deleted">Успішно видалено з улюблених.</string> + <string name="toast_channel_added">Успішно додано до улюблених.</string> + <string name="toast_channel_searched">Пошук доступних каналів:</string> + <string name="toast_cannot_search">Неможливо знайти доступні канали.</string> + <string name="toast_invalid_frequency">Недійсна частота для поточного розташування. Дійсний діапазон частот 87,5 - 108,0</string> + <string name="toast_invalid_input">Недійсне останнє введення. Дійсне значення 0 або 5.</string> + <string name="optmenu_rds_settings">Налаштування RDS</string> + <string name="dlg_rds_settings_channel_information">Інфо канала</string> + <string name="dlg_rds_settings_alternative_frequency">Альтернативна частота</string> + <string name="sound_mode">Режим звуку</string> + <string name="more">"Більше"</string> + <string name="power">"показник ступеня"</string> + <string name="toast_in_call">Неможливо запустити FM-радіо під час виклику.</string> + <string name="empty_list">Список каналів порожній.</string> + <string name="edit_frequency_overwrite_text">Перезапис</string> + <string name="fm_unit">МГц</string> + <string name="no_antenna_info">Підключіть навушники для використання в якості радіоантени. </string> + <string name="fm_recorder_name">FM-запис</string> + <string name="toast_recording_lost_warning">Запис буде втрачено через зняття SD!</string> + <string name="toast_start_recording">Почати запис...</string> + <string name="toast_sdcard_missing">Відсутня карта SD!</string> + <string name="toast_sdcard_insufficient_space">Недостатньо місця на карті SD.</string> + <string name="toast_recorder_internal_error">Внутрішня помилка диктофона!</string> + <string name="toast_player_internal_error">Внутрішня помилка програвача!</string> + <string name="toast_powerup_before_record_warning">Будь ласка, спочатку увімкніть живлення FM!</string> + <string name="optmenu_record">Запис FM</string> + <string name="btn_save_recording">"Зберегти"</string> + <string name="btn_discard_recording">Відхилити</string> + <string name="edit_recording_name_hint">Наберіть тут назву файла</string> + <string name="dlg_save_recording_title">Зберегти файл, що записується</string> + <string name="dlg_save_recording_storage_warning">"Недостаньо пам'яті! Бажаєте зберегти поточний запис?"</string> + <string name="already_exists">вже існує</string> + <string name="optmenu_speaker">Динамік</string> + <string name="optmenu_earphone">Навушник</string> + <string name="not_available">Зараз недоступний</string> + <string name="add_to_favorite1">Додати до поточних каналів</string> + <string name="contmenu_item_delete1">Видалити з поточних каналів</string> + <string name="dlg_delete_confirm_title1">Підтвердіть видалення з поточних каналів</string> + <string name="dlg_delete_confirm_text1">Точно видалити цей канал з поточних?</string> + <string name="toast_favorite_full1">Неможливо додати канал до списку поточних: він повний.</string> + <string name="toast_already_favorite1">Цей канал вже у списку поточних.</string> + <string name="toast_channel_deleted1">Успішно видалено з поточних.</string> + <string name="toast_channel_added1">Успішно додано до поточних каналів.</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values-ur/strings.xml b/MediaTek/FmRadio/res/values-ur/strings.xml new file mode 100755 index 0000000..5b31f8a --- /dev/null +++ b/MediaTek/FmRadio/res/values-ur/strings.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">ایف ایم ریڈیو</string> + <string name="favorite_manager">چینل کی فہرست</string> + <string name="add_to_favorite">پسند میں شامل کرنا</string> + <string name="optmenu_search">تلاش کرنا</string> + <string name="optmenu_exit">خارج ہونا</string> + <string name="contmenu_title">آپریشن</string> + <string name="contmenu_item_edit">ترمیم کرنا</string> + <string name="contmenu_item_delete">پسندیدگان سے ہٹائيں</string> + <string name="dlg_noantenna_text">آپ کو انٹینا کے بطور ایک ایر فون درکار ہے۔ براہ کرم اپنا ایرفون لگائیں۔</string> + <string name="dlg_noantenna_title">ائیرفون لگائیں</string> + <string name="btn_yes">ہاں</string> + <string name="btn_no">نہیں</string> + <string name="btn_ok">ٹھیک ہے</string> + <string name="btn_cancel">منسوخ کرنا</string> + <string name="dlg_progress_title">اسکین</string> + <string name="dlg_progress_text">چینلز اسکین کریں…</string> + <string name="dlg_addedit_station_name">نام:</string> + <string name="dlg_addedit_station_freq">فریکوئنسی:</string> + <string name="dlg_addedit_title_edit">چینل میں ترمیم کریں</string> + <string name="default_station_name">نیا چینل</string> + <string name="dlg_delete_confirm_title">چینل حذف کرنا یقینی بنانا</string> + <string name="dlg_delete_confirm_text">کیا آپ واقعی یہ چینل حذف کرنا چاہتے ہیں؟</string> + <string name="toast_favorite_full">پسندیدہ فہرست میں چینل شامل نہیں ہوسکتا کیوں کہ یہ بھری ہوا ہے۔</string> + <string name="toast_already_favorite">یہ پہلے سے ہی پسندیدہ فہرست میں موجود ہے۔</string> + <string name="toast_channel_deleted">پسندیدگان سے کامیابی کے ساتھ ہٹایا گیا۔</string> + <string name="toast_channel_added">پسندیدگان میں کامیابی سے شامل کیا گيا۔</string> + <string name="toast_channel_searched">تلاش کردہ دستیاب چینلز:</string> + <string name="toast_cannot_search">دستیبات چینل تلاش نہیں کرسکتا۔</string> + <string name="optmenu_rds_settings">RDS ترتیبات</string> + <string name="dlg_rds_settings_channel_information">چینل کی معلومات</string> + <string name="dlg_rds_settings_alternative_frequency">متبادل تعدد</string> + <string name="more">مزید ایپلی کیشن</string> + <string name="power">پاور</string> + <string name="sound_mode">آواز کی وضع</string> + <string name="edit_frequency_overwrite_text">اس کے اوپر تحریر کریں</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">ریڈیو انٹینا کے بطور استعمال کرنے کے لیے اپنے ایر فون لگائیں۔</string> + <!-- For FM recording --> + <string name="fm_recorder_name">ایف ایم ریکارڈر</string> + <string name="toast_recording_lost_warning">SD ہٹانے کی وجہ سے آپ کی ریکارڈنگ ختم ہوجائے گی!</string> + <string name="toast_start_recording">ریکارڈ کرنا شروع کریں…</string> + <string name="toast_sdcard_missing">آپ کا SD کارڈ غائب ہے!</string> + <string name="toast_sdcard_insufficient_space">SD کارڈ میں جگہ کافی نہيں!</string> + <string name="toast_recorder_internal_error">ریکارڈر میں اندرونی غلطی واقع!</string> + <string name="toast_player_internal_error">پلئیر میں اندرونی غلطی واقع!</string> + <string name="toast_powerup_before_record_warning">برائے مہربانی پہلے FM کھولیں!</string> + <string name="optmenu_record">FM ریکارڈ کریں</string> + <string name="btn_save_recording">محفوظ کریں</string> + <string name="btn_discard_recording">رد کریں</string> + <string name="edit_recording_name_hint">فائل کا نام یہاں لکھیں</string> + <string name="dlg_save_recording_title">ریکارڈنگ کی فائل محفوظ کریں</string> + <string name="dlg_save_recording_storage_warning">ذخیرہ کافی نہيں ہے! کیا آپ حالیہ ریکارڈنگ محفوظ کرنا چاہتے ہيں؟</string> + <string name="already_exists">پہلے سے موجود ہے</string> + <string name="toast_invalid_frequency">حالیہ مقام کے لئے غلط فریکوینسی۔ جائز فریکوینسی کا دائرہ کار: 87.5-108.0.</string> + <string name="toast_invalid_input">آخری غلط اندرج، درست قدر 0 اور 5 ہے۔</string> + <string name="toast_in_call">آپ کال میں رہنے کے دوران FM ریڈیو لانچ نہیں کرسکتے۔</string> + <string name="empty_list">چینل کی فہرست خالی ہے۔</string> + <string name="optmenu_speaker">اسپیکر</string> + <string name="optmenu_earphone">ہیڈ سیٹ</string> + <string name="not_available">ابھی دستیاب نہیں ہے</string> + <string name="add_to_favorite1">پہلے سے مرتب کردہ چینلوں میں شامل کریں</string> + <string name="contmenu_item_delete1">پہلے سے مرتب کردہ چینلوں سے ہٹائيں</string> + <string name="dlg_delete_confirm_title1">پہلے سے مرتب کردہ چینلوں سے ہٹانے کی تصدیق کریں</string> + <string name="dlg_delete_confirm_text1">کیا آپ واقعی اس چینل کو پہلے سے مرتب کردہ چینلوں سے مٹانا چاہتے ہيں؟</string> + <string name="toast_favorite_full1">پہلے سے مرتب کردہ چینل کی فہرست پر ہونے کی وجہ سے چینل کو پہلے سے مرتب کردہ چینل کی فہرست میں شامل نہیں کیا جاسکتا۔</string> + <string name="toast_already_favorite1">یہ چینل پہلے ہی پہلے سے مرتب کردہ چینل کی فہرست میں موجود ہے۔</string> + <string name="toast_channel_deleted1">پہلے سے مرتب کردہ چینلوں کی فہرست سے کامیابی سے ہٹایا گیا۔</string> + <string name="toast_channel_added1">پہلے سے مرتب کردہ چینلوں میں کامیابی سے شامل کیا گيا۔</string> +</resources> + diff --git a/MediaTek/FmRadio/res/values-vi/strings.xml b/MediaTek/FmRadio/res/values-vi/strings.xml new file mode 100755 index 0000000..bd66447 --- /dev/null +++ b/MediaTek/FmRadio/res/values-vi/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">Đài FM</string> + <string name="favorite_manager">D.sách kênh</string> + <string name="add_to_favorite">Thêm vào Mục y.thích</string> + <string name="optmenu_search">Tìm kiếm</string> + <string name="optmenu_exit">Thoát</string> + <string name="contmenu_title">Thao tác</string> + <string name="contmenu_item_edit">Sửa</string> + <string name="contmenu_item_delete">Xóa khỏi mục yêu thích</string> + <string name="dlg_noantenna_text">Bạn cần dùng tai nghe làm ăngten. Hãy cắm tai nghe.</string> + <string name="dlg_noantenna_title">Cắm tai nghe</string> + <string name="btn_yes">"Có"</string> + <string name="btn_no">"Không"</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Hủy</string> + <string name="dlg_progress_title">Dò</string> + <string name="dlg_progress_text">Đang dò kênh…</string> + <string name="dlg_addedit_station_name">Tên:</string> + <string name="dlg_addedit_station_freq">Tần suất:</string> + <string name="dlg_addedit_title_edit">Sửa kênh</string> + <string name="default_station_name">Kênh mới</string> + <string name="dlg_delete_confirm_title">Xác nhận xóa kênh</string> + <string name="dlg_delete_confirm_text">Bạn chắc chắn muốn xóa kênh này?</string> + <string name="toast_favorite_full">Không thể thêm kênh vào d.sách yêu thích vì đã đầy.</string> + <string name="toast_already_favorite">Kênh này đã có trong d.sách yêu thích.</string> + <string name="toast_channel_deleted">Đã xóa thành công khỏi mục yêu thích.</string> + <string name="toast_channel_added">Đã thêm thành công vào mục yêu thích.</string> + <string name="toast_channel_searched">Các kênh có sẵn đã tìm thấy:</string> + <string name="toast_cannot_search">Không tìm thấy kênh có sẵn.</string> + <string name="optmenu_rds_settings">Cài đặt RDS</string> + <string name="dlg_rds_settings_channel_information">Thông tin kênh</string> + <string name="dlg_rds_settings_alternative_frequency">Tần số thay thế</string> + <string name="more">Ứng dụng khác</string> + <string name="power">lũy thừa</string> + <string name="sound_mode">C.độ âm thanh</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Cắm tai nghe để dùng làm ăng ten đài FM.</string> + <!-- For FM recording --> + <string name="edit_frequency_overwrite_text">"Ghi đè"</string> + <string name="fm_recorder_name">Máy ghi âm FM</string> + <string name="toast_recording_lost_warning">Bản ghi âm của bạn sẽ bị mất do tháo thẻ SD!</string> + <string name="toast_start_recording">Bắt đầu ghi âm…</string> + <string name="toast_sdcard_missing">Thẻ SD của bạn bị thiếu!</string> + <string name="toast_sdcard_insufficient_space">D.lượng thẻ SD không đủ!</string> + <string name="toast_recorder_internal_error">Đã xảy ra lỗi nội bộ trong máy ghi âm!</string> + <string name="toast_player_internal_error">Đã xảy ra lỗi nội bộ trong trình phát!</string> + <string name="toast_powerup_before_record_warning">Hãy bật nguồn đài FM trước!</string> + <string name="optmenu_record">Ghi âm đài FM</string> + <string name="btn_save_recording">Lưu</string> + <string name="btn_discard_recording">Hủy bỏ</string> + <string name="edit_recording_name_hint">Nhập tên file vào đây</string> + <string name="dlg_save_recording_title">Lưu file ghi âm</string> + <string name="dlg_save_recording_storage_warning">Bộ nhớ không đủ! Bạn muốn lưu lại bản ghi hiện hành?</string> + <string name="already_exists">Đã tồn tại</string> + <string name="toast_invalid_frequency">Tần số không hợp lệ cho địa điểm hiện tại. Phạm vi tần số hợp lệ: 87,5-108,0.</string> + <string name="toast_invalid_input">Nhập số cuối không hợp lệ, giá trị hợp lệ là 0 hoặc 5.</string> + <string name="toast_in_call">Bạn không thể bật đài FM khi đang gọi điện.</string> + <string name="empty_list">Danh sách kênh trống.</string> + <string name="optmenu_speaker">"Loa"</string> + <string name="optmenu_earphone">Tai nghe</string> + <string name="not_available">Hiện không có sẵn</string> + <string name="add_to_favorite1">Thêm vào các kênh cài sẵn</string> + <string name="contmenu_item_delete1">Xóa khỏi các kênh cài sẵn</string> + <string name="dlg_delete_confirm_title1">Xác nhận xóa khỏi các kênh cài sẵn</string> + <string name="dlg_delete_confirm_text1">Bạn chắn chắn muốn xóa kênh này khỏi các kênh cài sẵn?</string> + <string name="toast_favorite_full1">Không thể thêm kênh vào d.sách kênh cài sẵn vì đã đầy.</string> + <string name="toast_already_favorite1">Kênh này đã có trong d.sách kênh cài sẵn.</string> + <string name="toast_channel_deleted1">Đã xóa thành công khỏi các kênh cài sẵn.</string> + <string name="toast_channel_added1">Đã thêm thành công vào các kênh cài sẵn.</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-zh-rCN/strings.xml b/MediaTek/FmRadio/res/values-zh-rCN/strings.xml new file mode 100755 index 0000000..97cd5d9 --- /dev/null +++ b/MediaTek/FmRadio/res/values-zh-rCN/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">收音机</string> + <string name="favorite_manager">频道列表</string> + <string name="add_to_favorite">添加到收藏</string> + <string name="optmenu_search">搜索</string> + <string name="optmenu_exit">退出</string> + <string name="contmenu_title">操作</string> + <string name="contmenu_item_edit">编辑</string> + <string name="contmenu_item_delete">取消收藏</string> + <string name="dlg_noantenna_text">您需要使用耳机来充当天线。请插入耳机。</string> + <string name="dlg_noantenna_title">插入耳机</string> + <string name="btn_yes">是</string> + <string name="btn_no">否</string> + <string name="btn_ok">确定</string> + <string name="btn_cancel">取消</string> + <string name="dlg_progress_title">搜索</string> + <string name="dlg_progress_text">搜索频道中…</string> + <string name="dlg_addedit_station_name">名字:</string> + <string name="dlg_addedit_station_freq">频率:</string> + <string name="dlg_addedit_title_edit">编辑频道</string> + <string name="default_station_name">新频道</string> + <string name="dlg_delete_confirm_title">确认取消收藏</string> + <string name="dlg_delete_confirm_text">您要取消收藏这个频道吗?</string> + <string name="toast_favorite_full">收藏栏已满,无法添加。</string> + <string name="toast_already_favorite">该频道已在收藏栏中。</string> + <string name="toast_channel_deleted">已取消收藏。</string> + <string name="toast_channel_added">收藏成功。</string> + <string name="toast_channel_searched">共找到有效频道:</string> + <string name="toast_cannot_search">找不到有效频道。</string> + <string name="toast_invalid_frequency">无效频段。有效频率范围:87.5-108.0。</string> + <string name="toast_invalid_input">最后一位输入无效,有效值为0或5。</string> + <string name="optmenu_rds_settings">RDS设置</string> + <string name="dlg_rds_settings_channel_information">频道信息</string> + <string name="dlg_rds_settings_alternative_frequency">自动切换频率</string> + <string name="sound_mode">声音模式</string> + <string name="more">更多</string> + <string name="power">电源</string> + <string name="toast_in_call">通话中无法打开收音机。</string> + <string name="empty_list">频道列表为空。</string> + <string name="optmenu_speaker">扬声器</string> + <string name="optmenu_earphone">耳机</string> + <string name="edit_frequency_overwrite_text">"覆盖"</string> + <string name="fm_unit">兆赫</string> + <string name="no_antenna_info">耳机是收音机的天线,请插入耳机。</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM录音</string> + <string name="toast_recording_lost_warning">由于SD卡被移除,录音文件将丢失!</string> + <string name="toast_start_recording">开始录音...</string> + <string name="toast_sdcard_missing">存储卡丢失!</string> + <string name="toast_sdcard_insufficient_space">SD卡存储空间不足!</string> + <string name="toast_recorder_internal_error">录音机发生内部错误!</string> + <string name="toast_player_internal_error">播放器发生内部错误!</string> + <string name="toast_powerup_before_record_warning">请先打开FM!</string> + <string name="optmenu_record">FM录音</string> + <string name="btn_save_recording">保存</string> + <string name="btn_discard_recording">放弃</string> + <string name="edit_recording_name_hint">在这里输入文件名称</string> + <string name="dlg_save_recording_title">保存录音文件</string> + <string name="dlg_save_recording_storage_warning">存储空间不足!是否要保存当前录音?</string> + <string name="already_exists">已存在</string> + <string name="not_available">当前不可用</string> + <string name="add_to_favorite1">添加至预置频道</string> + <string name="contmenu_item_delete1">从预置频道中删除</string> + <string name="dlg_delete_confirm_title1">确认频道删除</string> + <string name="dlg_delete_confirm_text1">您要删除这个预置频道吗?</string> + <string name="toast_favorite_full1">预置栏已满,无法添加。</string> + <string name="toast_already_favorite1">该频道已在预置栏中。</string> + <string name="toast_channel_deleted1">已从预置栏中删除频道。</string> + <string name="toast_channel_added1">已将频道添加到预置栏。</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-zh-rHK/strings.xml b/MediaTek/FmRadio/res/values-zh-rHK/strings.xml new file mode 100755 index 0000000..821b450 --- /dev/null +++ b/MediaTek/FmRadio/res/values-zh-rHK/strings.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">FM 收音機</string> + <string name="favorite_manager">頻道清單</string> + <string name="add_to_favorite">新增至我的最愛</string> + <string name="add_to_favorite1">新增至預設頻道</string> + <string name="optmenu_search">"搜尋"</string> + <string name="optmenu_exit">"結束"</string> + <string name="contmenu_title">操作</string> + <string name="contmenu_item_edit">"編輯"</string> + <string name="contmenu_item_delete">從我的最愛移除</string> + <string name="contmenu_item_delete1">從預設頻道刪除</string> + <string name="dlg_noantenna_text">你需要耳機作為天線。請插上你的耳機。</string> + <string name="dlg_noantenna_title">插入耳機</string> + <string name="btn_yes">"是"</string> + <string name="btn_no">"否"</string> + <string name="btn_ok">"確定"</string> + <string name="btn_cancel">"取消"</string> + <string name="dlg_progress_title">"搜尋"</string> + <string name="dlg_progress_text">搜索頻道......</string> + <string name="dlg_addedit_station_name">名字:</string> + <string name="dlg_addedit_station_freq">頻率:</string> + <string name="dlg_addedit_title_edit">編輯通道</string> + <string name="default_station_name">新頻道</string> + <string name="dlg_delete_confirm_title">確認從我的最愛刪除</string> + <string name="dlg_delete_confirm_title1">確認從預設頻道刪除</string> + <string name="dlg_delete_confirm_text">你確定你要從我的最愛中刪除此頻道?</string> + <string name="dlg_delete_confirm_text1">是否確定要從預設的頻道刪除此頻道?</string> + <string name="toast_favorite_full">無法新增此頻道到我的最愛清單,因為它已滿。</string> + <string name="toast_favorite_full1">無法新增此頻道到我的預設頻道清單中,因為它已滿。</string> + <string name="toast_already_favorite">此頻道已在我的最愛清單中。</string> + <string name="toast_already_favorite1">此頻道已在預設的頻道清單中。</string> + <string name="toast_channel_deleted">成功地從我的最愛中刪除。</string> + <string name="toast_channel_deleted1">成功從預設頻道中移除。</string> + <string name="toast_channel_added">已成功新增到我的最愛。</string> + <string name="toast_channel_added1">已成功新增到預設頻道。</string> + <string name="toast_channel_searched">搜詢出可用的頻道:</string> + <string name="toast_cannot_search">無法搜詢出可用的頻道。</string> + <string name="toast_invalid_frequency">不正確頻率為當前所在的位置。有效頻率範圍: 87.5-108.0</string> + <string name="toast_invalid_input">最後一個無效輸入,有效的值是 0 或 5。</string> + <string name="optmenu_rds_settings">RDS 的設定</string> + <string name="dlg_rds_settings_channel_information">頻道資訊</string> + <string name="dlg_rds_settings_alternative_frequency">可替代頻率</string> + <string name="sound_mode">聲音模式</string> + <string name="more">"更多"</string> + <string name="power">"指數"</string> + <string name="toast_in_call">撥接中,無法進行FM收音機。</string> + <string name="empty_list">頻道清單是空的。</string> + <string name="edit_frequency_overwrite_text">"覆寫"</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">插入耳機當作收音機天線。</string> + <string name="fm_recorder_name">FM 答錄機</string> + <string name="toast_recording_lost_warning">因SD卡的移除,您的錄音檔將遺失 !</string> + <string name="toast_start_recording">開始錄製......</string> + <string name="toast_sdcard_missing">你的 SD 已遺失 !</string> + <string name="toast_sdcard_insufficient_space">SD 卡空間不足 !</string> + <string name="toast_recorder_internal_error">在答錄機中出現內部錯誤 !</string> + <string name="toast_player_internal_error">在播放機中出現內部錯誤 !</string> + <string name="toast_powerup_before_record_warning">首先請打開FM電源 !</string> + <string name="optmenu_record">記錄FM</string> + <string name="btn_save_recording">"儲存"</string> + <string name="btn_discard_recording">"捨棄"</string> + <string name="edit_recording_name_hint">在此輸入檔案名稱</string> + <string name="dlg_save_recording_title">將錄音檔保存</string> + <string name="dlg_save_recording_storage_warning">儲存空間不足 !您想保存當前錄製嗎?</string> + <string name="already_exists">已存在</string> + <string name="optmenu_speaker">"揚聲器"</string> + <string name="optmenu_earphone">耳機</string> + <string name="not_available">現在不可用</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-zh-rTW/strings.xml b/MediaTek/FmRadio/res/values-zh-rTW/strings.xml new file mode 100755 index 0000000..b9e47c6 --- /dev/null +++ b/MediaTek/FmRadio/res/values-zh-rTW/strings.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">調頻廣播</string> + <string name="favorite_manager">頻道清單</string> + <string name="add_to_favorite">新增到我的最愛</string> + <string name="optmenu_search">搜尋</string> + <string name="optmenu_exit">結束</string> + <string name="contmenu_title">操作</string> + <string name="contmenu_item_edit">編輯</string> + <string name="contmenu_item_delete">從我的最愛移除</string> + <string name="dlg_noantenna_text">您需要耳機充當天線。請插入您的耳機。</string> + <string name="dlg_noantenna_title">插入耳機</string> + <string name="btn_yes">是</string> + <string name="btn_no">否</string> + <string name="btn_ok">確定</string> + <string name="btn_cancel">取消</string> + <string name="dlg_progress_title">搜尋</string> + <string name="dlg_progress_text">搜尋頻道...</string> + <string name="dlg_addedit_station_name">名稱:</string> + <string name="dlg_addedit_station_freq">頻率:</string> + <string name="dlg_addedit_title_edit">編輯頻道</string> + <string name="default_station_name">新頻道</string> + <string name="dlg_delete_confirm_title">確認從我的最愛移除</string> + <string name="dlg_delete_confirm_text">您是否確定要從我的最愛移除這個頻道?</string> + <string name="toast_favorite_full">由於已滿,而無法將頻道新增到我的最愛清單。</string> + <string name="toast_already_favorite">這個頻道已在我的最愛清單內。</string> + <string name="toast_channel_deleted">已成功從我的最愛移除。</string> + <string name="toast_channel_added">已成功新增至我的最愛。</string> + <string name="toast_channel_searched">找到可用頻道:</string> + <string name="toast_cannot_search">找不到可用頻道。</string> + <string name="toast_invalid_frequency">目前位置的頻率無效。有效頻率範圍:87.5至108.0</string> + <string name="toast_invalid_input">最近一次輸入無效,有效值為0或5。</string> + <string name="optmenu_rds_settings">RDS設定</string> + <string name="dlg_rds_settings_channel_information">頻道資訊</string> + <string name="dlg_rds_settings_alternative_frequency">替代頻率</string> + <string name="more">更多應用程式</string> + <string name="power">電源</string> + <string name="sound_mode">音效模式</string> + <string name="toast_in_call">你在通話時,無法啟動調頻(FM)廣播。</string> + <string name="empty_list">頻道清單空白。</string> + <string name="optmenu_speaker">擴音器</string> + <string name="optmenu_earphone">耳機</string> + <string name="edit_frequency_overwrite_text">"覆寫"</string> + <string name="fm_unit">兆赫</string> + <string name="no_antenna_info">插入耳機當作收音機天線。</string> + <!-- For FM recording --> + <string name="fm_recorder_name">調頻(FM)錄音機</string> + <string name="toast_recording_lost_warning">您的錄音將因SD記憶卡移除而遺失!</string> + <string name="toast_start_recording">開始錄製…</string> + <string name="toast_sdcard_missing">您的SD記憶卡遺失中!</string> + <string name="toast_sdcard_insufficient_space">SD記憶卡空間不足!</string> + <string name="toast_recorder_internal_error">錄製程式發生內部錯誤!</string> + <string name="toast_player_internal_error">播放程式發生內部錯誤!</string> + <string name="toast_powerup_before_record_warning">請先打開FM的電源!</string> + <string name="optmenu_record">錄製 FM</string> + <string name="btn_save_recording">儲存</string> + <string name="btn_discard_recording">捨棄</string> + <string name="edit_recording_name_hint">在這裡輸檔案名稱入</string> + <string name="dlg_save_recording_title">儲存錄製檔案</string> + <string name="dlg_save_recording_storage_warning">儲存空間不足!要儲存目前錄製的資料?</string> + <string name="already_exists">已經存在</string> + <string name="not_available">目前不可用</string> + <string name="add_to_favorite1">新增到預設頻道</string> + <string name="contmenu_item_delete1">從預設頻道中移除</string> + <string name="dlg_delete_confirm_title1">確認從預設頻道移除</string> + <string name="dlg_delete_confirm_text1">您是否確定要從預設頻道移除這個頻道?</string> + <string name="toast_favorite_full1">由於已滿,而無法將頻道新增到預設頻道清單。</string> + <string name="toast_already_favorite1">這個頻道已在預設頻道清單內。</string> + <string name="toast_channel_deleted1">已成功從預設頻道移除。</string> + <string name="toast_channel_added1">已成功新增至預設頻道。</string> +</resources> diff --git a/MediaTek/FmRadio/res/values-zu/strings.xml b/MediaTek/FmRadio/res/values-zu/strings.xml new file mode 100755 index 0000000..ecc4715 --- /dev/null +++ b/MediaTek/FmRadio/res/values-zu/strings.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name">Umsakazo we-FM</string> + <string name="dlg_progress_title">Sesha</string> + <string name="btn_yes">Yebo</string> + <string name="optmenu_speaker">Isikhulumi</string> + <string name="edit_frequency_overwrite_text">Bhala ngaphezulu</string> + <string name="toast_start_recording">Qala ukuqopha...</string> + <string name="fm_unit">MHz</string> + <string name="empty_list">Uhlu lweshaneli alunalutho.</string> + <string name="optmenu_rds_settings">Amasethingi e-RDS</string> + <string name="toast_channel_searched">Hlolile amashaneli atholakalayo:</string> + <string name="already_exists">ivele ikhona</string> + <string name="dlg_noantenna_title">faka ama-earphone</string> + <string name="add_to_favorite">Engeza Kokuthandwayo</string> + <string name="toast_sdcard_insufficient_space">Isikhala asanele kwikhadi le-SD!</string> + <string name="dlg_delete_confirm_title">Qinisekisa ukususa kokuthandwayo</string> + <string name="optmenu_record">Qopha i-FM</string> + <string name="optmenu_earphone">I-earphone</string> + <string name="sound_mode">Imowudi yomsindo</string> + <string name="toast_already_favorite">Leshaneli isivele ukuhlu lokuthandwayo.</string> + <string name="not_available">Okwamanje ayitholakali</string> + <string name="toast_channel_deleted">Isuswe ngempumelelo kokuthandwayo.</string> + <string name="toast_channel_added">Yongezwe ngokuyimpumelelo kokuthandwayo.</string> + <string name="dlg_rds_settings_channel_information">Imniningwane yeshaneli</string> + <string name="toast_favorite_full">Ayongezeki ishaneli kuhlu lokuthandwayo ngenxa yokuba igcwele.</string> + <string name="btn_save_recording">Gcina</string> + <string name="optmenu_search">Sesha</string> + <string name="dlg_rds_settings_alternative_frequency">Ifrikwensi Enye</string> + <string name="dlg_progress_text">Sesha amashaneli...</string> + <string name="optmenu_exit">Phuma</string> + <string name="more">Okuningi</string> + <string name="btn_discard_recording">Khipha</string> + <string name="contmenu_item_edit">Lungisa</string> + <string name="toast_cannot_search">Akusesheki amashaneli atholakalayo.</string> + <string name="dlg_save_recording_storage_warning">Isikhala sokugcina asanele! Uyafuna ukugcina lokuqopha kwamanje?</string> + <string name="toast_in_call">Ngeke ukwazi ukuphumisa umsaka we-FM uma usefonini.</string> + <string name="dlg_addedit_station_freq">Ifrikwensi:</string> + <string name="toast_recorder_internal_error">Kwenzeke iphutha ngaphakathi kwisiqophi!</string> + <string name="dlg_save_recording_title">Gcina ifayela yokuqopha</string> + <string name="btn_ok">KULUNGILE</string> + <string name="power">Ugesi</string> + <string name="contmenu_item_delete">Susa kokuthandwayo</string> + <string name="toast_powerup_before_record_warning">Sicela ukhanyise i-FM kuqala!</string> + <string name="fm_recorder_name">Isiqophi se-FM</string> + <string name="toast_recording_lost_warning">Ukuqopha kwakho kuzolahleka ngenxa yokususwa kwe-SD!</string> + <string name="dlg_delete_confirm_text">Unesiqiniseko sokuthi ufuna ukususa leshaneli kokuthandwayo?</string> + <string name="default_station_name">Ishanelo Entsha</string> + <string name="btn_cancel">Khansela</string> + <string name="contmenu_title">Imisebenzi</string> + <string name="btn_no">Cha</string> + <string name="favorite_manager">Uhlu lweshaneli</string> + <string name="toast_invalid_frequency">Ifrikwensi engaqinisekisiwe yendawo yamanje. Indawo eqinisekisiwe yefrikwensi: u-87.5 – 108.0</string> + <string name="toast_sdcard_missing">Ikhadi lakho le-SD lilahlekile!</string> + <string name="dlg_addedit_station_name">Igama:</string> + <string name="dlg_addedit_title_edit">Lungisa ishaneli</string> + <string name="toast_invalid_input">Okokugcina okufakiwe phakathi akuqisekiwe, inani eliqinisekisiswe u-0 noma u-5.</string> + <string name="edit_recording_name_hint">Bhala igama lefayela lapha</string> + <string name="dlg_noantenna_text">Udinga i-earphone njenge eriyeli. Sicela ufake i-earphone yakho.</string> + <string name="toast_player_internal_error">Kwenzeke iphutha ngaphakathi kwi-Player!</string> +</resources>
\ No newline at end of file diff --git a/MediaTek/FmRadio/res/values/strings.xml b/MediaTek/FmRadio/res/values/strings.xml new file mode 100755 index 0000000..0967189 --- /dev/null +++ b/MediaTek/FmRadio/res/values/strings.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + <string name="app_name">FM Radio</string> + <string name="favorite_manager">Channel list</string> + <string name="add_to_favorite">Add to Favorite</string> + <string name="optmenu_search">Search</string> + <string name="optmenu_exit">Exit</string> + <string name="contmenu_title">Operations</string> + <string name="contmenu_item_edit">Edit</string> + <string name="contmenu_item_delete">Remove from favorites</string> + <string name="dlg_noantenna_text">You need an earphone as antenna. Please plug in your earphone.</string> + <string name="dlg_noantenna_title">Plug in earphone</string> + <string name="btn_yes">Yes</string> + <string name="btn_no">No</string> + <string name="btn_ok">OK</string> + <string name="btn_cancel">Cancel</string> + <string name="dlg_progress_title">Search</string> + <string name="dlg_progress_text">Search channels...</string> + <string name="dlg_addedit_station_name">Name:</string> + <string name="dlg_addedit_station_freq">Frequency:</string> + <string name="dlg_addedit_title_edit">Edit Channel</string> + <string name="default_station_name">New Channel</string> + <string name="dlg_delete_confirm_title">Confirm remove from favorites</string> + <string name="dlg_delete_confirm_text">Are you sure you want to remove this channel from favorites?</string> + <string name="toast_favorite_full">Cannot add the channel to favorite list because it is full.</string> + <string name="toast_already_favorite">This channel is already in favorite list.</string> + <string name="toast_channel_deleted">Successfully removed from favorites.</string> + <string name="toast_channel_added">Successfully added to favorites.</string> + <string name="toast_channel_searched">Searched out available channels:</string> + <string name="toast_cannot_search">Cannot search out available channel.</string> + <string name="toast_invalid_frequency">Invalid frequency for current location. Valid frequency scope: 87.5-108.0</string> + <string name="toast_invalid_input">The last invalid input, valid value is 0 or 5.</string> + <string name="optmenu_rds_settings">RDS settings</string> + <string name="dlg_rds_settings_channel_information">Channel information</string> + <string name="dlg_rds_settings_alternative_frequency">Alternative frequency</string> + <string name="sound_mode">Sound mode</string> + <string name="more">More</string> + <string name="power">Power</string> + <string name="toast_in_call">You can not launch FM Radio when you are in call.</string> + <string name="empty_list">Channel list is empty.</string> + <string name="edit_frequency_overwrite_text">Overwrite</string> + <string name="fm_unit">MHz</string> + <string name="no_antenna_info">Plug in your earphones to use as a radio antenna.</string> + <!-- For FM recording --> + <string name="fm_recorder_name">FM Recorder</string> + <string name="toast_recording_lost_warning">Your recording will be lost due to SD removal!</string> + <string name="toast_start_recording">Start recording...</string> + <string name="toast_sdcard_missing">Your SD card is missing!</string> + <string name="toast_sdcard_insufficient_space">Insufficient SD card space!</string> + <string name="toast_recorder_internal_error">An internal error occured in recorder!</string> + <string name="toast_player_internal_error">An internal error occured in player!</string> + <string name="toast_powerup_before_record_warning">Please power up FM first!</string> + <string name="optmenu_record">Record FM</string> + <string name="btn_save_recording">Save</string> + <string name="btn_discard_recording">Discard</string> + <string name="edit_recording_name_hint">Type file name here</string> + <string name="dlg_save_recording_title">Save recording file</string> + <string name="dlg_save_recording_storage_warning">Insufficient storage! Do you want to save current recording?</string> + <string name="already_exists">already exists</string> + <string name="optmenu_speaker">Speaker</string> + <string name="optmenu_earphone">Earphone</string> + <string name="not_available">Currently not available</string> + <string name="add_to_favorite1">Add to preset channels</string> + <string name="contmenu_item_delete1">Remove from preset channels</string> + <string name="dlg_delete_confirm_title1">Confirm remove from preset channels</string> + <string name="dlg_delete_confirm_text1">Are you sure you want to remove this channel from preset channels?</string> + <string name="toast_favorite_full1">Cannot add the channel to preset channel list because it is full.</string> + <string name="toast_already_favorite1">This channel is already in preset channel list.</string> + <string name="toast_channel_deleted1">Successfully removed from preset channels.</string> + <string name="toast_channel_added1">Successfully added to preset channels.</string> + + <!-- For Em Rx --> + <string name="FMR_Freq_text" translatable="false">Freq(MHz)</string> + <string name="FMR_Freq_tune" translatable="false">Tune</string> + <string name="FMR_Antenna_text" translatable="false">Antenna Type</string> + <string name="FMR_Antenna_short" translatable="false">Short</string> + <string name="FMR_Antenna_long" translatable="false">EarPhone</string> + <string name="FMR_Status_text" translatable="false">Status</string> + <string name="FMR_Force_Stereomono_text" translatable="false">Force Set:</string> + <string name="FMR_Status_Stereomono_text" translatable="false">Stereo/Mono:</string> + <string name="FMR_Stereomono_stereo" translatable="false">Stereo</string> + <string name="FMR_Stereomono_mono" translatable="false">Mono</string> + <string name="FMR_Status_Stereomono" translatable="false">detecting...</string> + <string name="FMR_Status_RSSI_text" translatable="false">RSSI(dBm):</string> + <string name="FMR_Status_RSSI" translatable="false">detecting...</string> + <string name="FMR_Status_Caparray_text" translatable="false">CapArray(pF):</string> + <string name="FMR_Status_Caparray" translatable="false">detecting...</string> + <string name="FMR_RDS_text" translatable="false">RDS</string> + <string name="FMR_RDS_Ratio_text" translatable="false">Ratio:</string> + <string name="FMR_RDS_Ratio" translatable="false">detecting...</string> + <string name="FMR_RDS_PS_text" translatable="false">PS:</string> + <string name="FMR_RDS_PS" translatable="false">None.</string> + <string name="FMR_RDS_RT_text" translatable="false">RT:</string> + <string name="FMR_RDS_RT" translatable="false">None.</string> + <string name="FMR_Hardware_version" translatable="false">Hardware Version</string> + <string name="FMR_Chip_ID_text" translatable="false">Chip ID</string> + <string name="FMR_Chip_ID" translatable="false">None.</string> + <string name="FMR_ECO_Version_text" translatable="false">ECO Version</string> + <string name="FMR_ECO_Version" translatable="false">None.</string> + <string name="FMR_Patch_Version_text" translatable="false">Patch Version</string> + <string name="FMR_Patch_Version" translatable="false">None.</string> + <string name="FMR_DSP_Version_text" translatable="false">DSP Version</string> + <string name="FMR_DSP_Version" translatable="false">None.</string> + <string name="FMR_EM_RSSI_THRESHOLD_text" translatable="false">RSSI THRESHOLD</string> + <string name="FMR_EM_MUTE_GAIN_text" translatable="false">SMG</string> + <string name="FMR_EM_DESENSE_RSSI_text" translatable="false">Desense RSSI</string> + <string name="FMR_EM_OK_TEXT" translatable="false">OK</string> + <string name="FMR_EM_CMD_text" translatable="false">0X</string> + <string name="FMR_EM_CMD_title" translatable="false">CMD EXPAND</string> + <string name="FMR_EM_CMD_return" translatable="false">CMD EXPAND RETURN VALUE</string> + <string name="FMR_EM_DEFAULT_VALUE" translatable="false">0</string> +</resources> diff --git a/MediaTek/FmRadio/res/values/strings_test.xml b/MediaTek/FmRadio/res/values/strings_test.xml new file mode 100755 index 0000000..1bdedc4 --- /dev/null +++ b/MediaTek/FmRadio/res/values/strings_test.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="test_success" translatable="false">成功</string> + <string name="test_fail" translatable="false">失败</string> + <string name="test_search" translatable="false">搜索</string> +</resources> diff --git a/MediaTek/FmRadio/res/values/styles.xml b/MediaTek/FmRadio/res/values/styles.xml new file mode 100755 index 0000000..34c1a83 --- /dev/null +++ b/MediaTek/FmRadio/res/values/styles.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright Statement: + + This software/firmware and related documentation ("MediaTek Software") are + protected under relevant copyright laws. The information contained herein is + confidential and proprietary to MediaTek Inc. and/or its licensors. Without + the prior written permission of MediaTek inc. and/or its licensors, any + reproduction, modification, use or disclosure of MediaTek Software, and + information contained herein, in whole or in part, shall be strictly + prohibited. + + MediaTek Inc. (C) 2011-2014. All rights reserved. + + BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + + The following software/firmware and/or related documentation ("MediaTek + Software") have been modified by MediaTek Inc. All revisions are subject to + any receiver's applicable license agreements with MediaTek Inc. +--> +<resources> + + <style name="AppTheme" parent="@android:style/Theme.Material"> + + </style> + +</resources> diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java new file mode 100755 index 0000000..f40619c --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java @@ -0,0 +1,2196 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.SystemClock; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnDismissListener; +import android.widget.PopupMenu.OnMenuItemClickListener; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.mediatek.fmradio.dialogs.NoAntennaDialog; +import com.mediatek.fmradio.dialogs.SearchChannelsDialog; +import com.mediatek.fmradio.ext.IProjectStringExt; + +import java.io.File; +/* Vanzo:libing on: Thu, 15 May 2014 19:34:51 +0800 + */ +import java.io.FileReader; +import java.io.IOException; +import android.app.ActivityManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.SystemProperties; +//import com.android.featureoption.FeatureOption; +// End of Vanzo:libing + +/** + * This class interact with user, provider FM basic function and FM recording + * function + */ +public class FmRadioActivity extends Activity implements +/* Vanzo:libing on: Thu, 15 May 2014 19:36:32 +0800 + */ + SensorEventListener, +// End of Vanzo:libing + OnMenuItemClickListener, OnDismissListener, + NoAntennaDialog.NoAntennaListener, + SearchChannelsDialog.CancelSearchListener, + FmRecordDialogFragment.OnRecordingDialogClickListener { + // Logging + private static final String TAG = "FmRx/Activity"; + + // Dialog tags + private static final String TAG_SEARCH = "Search"; + private static final String TAG_SAVE_RECORDINGD = "SaveRecording"; + private static final String TAG_NO_ANTENNA = "NoAntenna"; + + // Use shared preference to store record or play time + private static final String REFS_NAME = "FMRecord"; + private static final String START_RECORD_TIME = "startRecordTime"; + private static final String START_PLAY_TIME = "startPlayTime"; + + // Request code + private static final int REQUEST_CODE_FAVORITE = 1; + + // FM + private static final String FM = "FM"; + // Short antenna support + private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport(); + + // UI views + private TextView mTextStationName = null; + private TextView mTextStationValue = null; + // RDS text view + private TextView mTextRds = null; + // Text view display "FM" + private TextView mTextFm = null; + // Text View display "MHZ" + private TextView mTextMHz = null; + private TextView mTxtRecInfoLeft = null; + private TextView mTxtRecInfoRight = null; + private ImageButton mButtonDecrease = null; + private ImageButton mButtonPrevStation = null; + private ImageButton mButtonNextStation = null; + private ImageButton mButtonIncrease = null; + private ImageButton mButtonAddToFavorite = null; + private ImageButton mButtonRecord = null; + private ImageButton mButtonStop = null; + private ImageButton mButtonPlayback = null; + private Animation mAnimation = null; + private ImageView mAnimImage = null; + + // Layout display recording file information + private RelativeLayout mRLRecordInfo = null; + + // Menu items + private MenuItem mMenuItemChannelList = null; + private MenuItem mMenuItemOverflow = null; + private MenuItem mMenuItemPower = null; + private PopupMenu mPopupMenu = null; + + // State variables + private boolean mIsServiceStarted = false; + private boolean mIsServiceBinded = false; + private boolean mNeedTuneto = false; + private boolean mIsNeedDisablePower = false; + private boolean mIsPlaying = false; + private boolean mIsInRecordingMode = false; + private boolean mIsNeedShowRecordDlg = false; + private boolean mIsNeedShowNoAntennaDlg = false; + private boolean mIsNeedShowSearchDlg = true; + private boolean mIsActivityForeground = true; + + // Record variables + private long mRecordStartTime = 0; + private long mPlayStartTime = 0; + private int mPrevRecorderState = FmRecorder.STATE_INVALID; + private int mCurrentStation = FmRadioUtils.DEFAULT_STATION; + private int mRecordState = 0; + + // Instance variables + private FmRadioService mService = null; + private Context mContext = null; + private Toast mToast = null; + private FragmentManager mFragmentManager = null; + private AudioManager mAudioManager = null; + + // Plugin + private IProjectStringExt mProjectStringExt = null; +/* Vanzo:libing on: Fri, 02 Aug 2013 15:31:08 +0800 + */ + private static final String GESTURE_SWITCH_FLAG = "persist.sys.gesture_switch"; + private static final String GESTURE_FMRADIO_FLAG = "persist.sys.gesture_fmradio"; + + // 1.first psensor value large than the GESTURE_FMRADIO_MAX_DISTANCE + private static int GESTURE_FMRADIO_MAX_DISTANCE = 350; + // 2.second psensor value small than the GESTURE_FMRADIO_MIN_DISTANCE + private static int GESTURE_FMRADIO_MIN_DISTANCE = 150; + // delay time of the gesture run hander,200 is 0.2s + private static final int GESTURE_RUN_POST_DELAY_TIME = 200; + private SensorManager mSensorManager; + private Sensor mSensor = null; + private Handler myHandler; + private int mPrePsensor = 0; + + private boolean mGestureEnabled; + private boolean mFMRadioEnabled; + private boolean mHavePsensor = true; + private boolean mHadGesture = false; +// end of vanzo:libing +/* Vanzo:lupei on: Fri, 28 Aug 2015 14:50:36 +0800 + * add default gesture distance max min value + */ + //private String DEFAULT_GESTURE_DIST_MAX_MIN = com.android.featureoption.FeatureOption.VANZO_FEATURE_DEFAULT_GESTURE_DISTANCE_MAX_MIN_VALUE; +// End of Vanzo:lupei + + // Service listener + private FmRadioListener mFmRadioListener = new FmRadioListener() { + @Override + public void onCallBack(Bundle bundle) { + int flag = bundle.getInt(FmRadioListener.CALLBACK_FLAG); + Log.d(TAG, "call back method flag:" + flag); + + if (flag == FmRadioListener.MSGID_FM_EXIT) { + mHandler.removeCallbacksAndMessages(null); + } + + // remove tag message first, avoid too many same messages in queue. + Message msg = mHandler.obtainMessage(flag); + msg.setData(bundle); + mHandler.removeMessages(flag); + mHandler.sendMessage(msg); + } + }; + + // Handle sdcard unmount event + private final BroadcastReceiver mSdcardListener = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + + if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { + Log.d(TAG, "Sd card mounted"); + return; + } + + // If not unmount recording sd card, do nothing; + if (!isRecordingCardUnmount(intent)) { + return; + } + + if (Intent.ACTION_MEDIA_EJECT.equals(action) + || Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager + .findFragmentByTag(TAG_SAVE_RECORDINGD); + if ((null != df && df.getShowsDialog()) || mIsNeedShowRecordDlg) { + Log.d(TAG, "recording sd card unmounted,dismiss save dialog"); + dismissSaveRecordingDialog(); + mIsNeedShowRecordDlg = false; + showToast(getString(R.string.toast_recording_lost_warning)); + } + Log.d(TAG, "Sd card Eject or unmounted"); + } + } + }; + + // Button click listeners on UI + private final View.OnClickListener mButtonClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_record: + // if power up, record FM, else toast prompt user to power up + Log.d(TAG, "btn record: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + if (!mIsPlaying) { + showToast(getString(R.string.toast_powerup_before_record_warning)); + return; + } + refreshRecordNotIdle(); + mRecordStartTime = SystemClock.elapsedRealtime(); + editSharedPreferences(START_RECORD_TIME, mRecordStartTime); + mService.startRecordingAsync(); + mService.setModifiedRecordingName(null); + break; + + case R.id.btn_stop: + // stop record and stop play record file + Log.d(TAG, "btn stop: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + refreshRecordNotIdle(); + mService.stopRecordingAsync(); + mService.stopPlaybackAsync(); + break; + + case R.id.btn_playback: + Log.d(TAG, "btn playback: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + refreshRecordNotIdle(); + mPlayStartTime = SystemClock.elapsedRealtime(); + editSharedPreferences(START_PLAY_TIME, mPlayStartTime); + mService.startPlaybackAsync(); + break; + + case R.id.button_add_to_favorite: + Log.d(TAG, "onClick AddToFavorite start"); + updateFavoriteStation(); + Log.d(TAG, "onClick AddToFavorite end"); + break; + + case R.id.button_decrease: + tuneToStation(FmRadioUtils.computeDecreaseStation(mCurrentStation)); + break; + + case R.id.button_increase: + tuneToStation(FmRadioUtils.computeIncreaseStation(mCurrentStation)); + break; + + case R.id.button_prevstation: + Log.d(TAG, "onClick PrevStation"); + // Search for the previous station. + seekStation(mCurrentStation, false); // false: previous station + // true: next station + break; + + case R.id.button_nextstation: + // Search for the next station. + seekStation(mCurrentStation, true); // false: previous station + // true: next station + break; + + default: + Log.d(TAG, "invalid view id"); + break; + } + } + }; + + /** + * Main thread handler to update UI + */ + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + Log.d(TAG, "mHandler.handleMessage: what = " + msg.what + + ",hashcode:" + mHandler.hashCode()); + Bundle bundle; + switch (msg.what) { + case FmRadioListener.MSGID_REFRESH: + refreshTimeText(); + break; + + case FmRadioListener.MSGID_POWERUP_FINISHED: + bundle = msg.getData(); + boolean isPowerup = bundle + .getBoolean(FmRadioListener.KEY_IS_POWER_UP); + mIsPlaying = isPowerup; + Log.d(TAG, "updateFMState: FMRadio is powerup = " + isPowerup); + stopAnimation(); + if (isPowerup) { + refreshImageButton(true); + refreshPopupMenuItem(true); + refreshActionMenuItem(true); + } else { + showToast(getString(R.string.not_available)); + } + // if not powerup success, refresh power to enable. + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_SWITCH_ANNTENNA: + bundle = msg.getData(); + boolean isSwitch = bundle + .getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA); + Log.d(TAG, "[FmRadioActivity.mHandler] swtich antenna: " + isSwitch); + if (!isSwitch) { + if (mIsActivityForeground) { + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } else { + Log.d(TAG, "need show no antenna dialog after onResume:"); + mIsNeedShowNoAntennaDlg = true; + } + stopAnimation(); + // if not powerup success, refresh power to enable. + refreshActionMenuPower(true); + } else { + mIsNeedShowNoAntennaDlg = false; + dismissNoAntennaDialog(); + } + break; + + case FmRadioListener.MSGID_POWERDOWN_FINISHED: + bundle = msg.getData(); + boolean isPowerdown = bundle + .getBoolean(FmRadioListener.KEY_IS_POWER_DOWN); + mIsPlaying = !isPowerdown; + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_TUNE_FINISHED: + bundle = msg.getData(); + boolean tuneFinish = bundle.getBoolean(FmRadioListener.KEY_IS_TUNE); + boolean isPowerUp = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP); + // when power down state, tune from channel list, + // will call back send mIsPowerup state. + mIsPlaying = mIsPlaying ? mIsPlaying : isPowerUp; + + stopAnimation(); + // tune finished, should make power enable + mIsNeedDisablePower = false; + float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION); + mCurrentStation = FmRadioUtils.computeStation(frequency); + // After tune to station finished, refresh favorite button and + // other button status. + refreshStationUI(mCurrentStation); + // tune fail,should resume button status + if (!tuneFinish) { + Log.d(TAG, "mHandler.tune: " + tuneFinish); + refreshActionMenuItem(mIsPlaying); + refreshImageButton(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + refreshActionMenuPower(true); + return; + } + refreshImageButton(true); + refreshActionMenuItem(true); + refreshPopupMenuItem(true); + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_SCAN_FINISHED: + bundle = msg.getData(); + // cancel scan happen + boolean isScan = bundle.getBoolean(FmRadioListener.KEY_IS_SCAN); + int tuneToStation = bundle.getInt(FmRadioListener.KEY_TUNE_TO_STATION); + int searchedNum = bundle.getInt(FmRadioListener.KEY_STATION_NUM); + refreshActionMenuItem(mIsPlaying); + refreshImageButton(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + // ebable action menu power items + refreshActionMenuPower(true); + + if (!isScan) { + dismissSearchDialog(); + Log.d(TAG, "mHandler.scan canceled. not enter to channel list."); + return; + } + + mCurrentStation = tuneToStation; + // After tune to station finished, refresh favorite button and + // other button status. + refreshStationUI(mCurrentStation); + dismissSearchDialog(); + + if (searchedNum == 0) { + showToast(getString(R.string.toast_cannot_search)); + return; + } + + enterChannelList(); + // Show toast to tell user how many stations have been searched + showToast(getString(R.string.toast_channel_searched) + " " + + String.valueOf(searchedNum)); + break; + + case FmRadioListener.MSGID_FM_EXIT: + finish(); + break; + + case FmRadioListener.LISTEN_RDSSTATION_CHANGED: + bundle = msg.getData(); + int rdsStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION); + refreshStationUI(rdsStation); + break; + + case FmRadioListener.LISTEN_PS_CHANGED: + case FmRadioListener.LISTEN_RT_CHANGED: + bundle = msg.getData(); + String text = ""; + String psString = bundle.getString(FmRadioListener.KEY_PS_INFO); + String rtString = bundle.getString(FmRadioListener.KEY_RT_INFO); + if ((null != psString) && (psString.length() > 0)) { + text += psString; + } + if ((null != rtString) && (rtString.length() > 0)) { + if (text.length() > 0) { + text += " "; + } + text += rtString; + } + showRds(text); + break; + + case FmRadioListener.LISTEN_RECORDSTATE_CHANGED: + bundle = msg.getData(); + int recorderState = bundle + .getInt(FmRadioListener.KEY_RECORDING_STATE); + Log.d(TAG, "FmRadioActivity.mHandler: recorderState = " + + recorderState); + updateRecordingState(recorderState); + break; + + case FmRadioListener.LISTEN_RECORDERROR: + bundle = msg.getData(); + int errorState = bundle + .getInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE); + updateRecorderError(errorState); + break; + + case FmRadioListener.LISTEN_RECORDMODE_CHANGED: + bundle = msg.getData(); + boolean isInRecordingMode = bundle + .getBoolean(FmRadioListener.KEY_IS_RECORDING_MODE); + exitRecordingMode(isInRecordingMode); + break; + + case FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED: + bundle = msg.getData(); + boolean isSpeakerMode = bundle + .getBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE); + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_sound_mode).setTitle(isSpeakerMode ? + R.string.optmenu_earphone : R.string.optmenu_speaker); + refreshSoundModeVisiable(); + } + break; + + default: + Log.d(TAG, "invalid message"); + break; + } + Log.d(TAG, "handleMessage"); + } + }; + + // When call bind service, it will call service connect. register call back + // listener and initial device + private final ServiceConnection mServiceConnection = new ServiceConnection() { + + /** + * called by system when bind service + * + * @param className component name + * @param service service binder + */ + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + Log.d(TAG, "FmRadioActivity.onServiceConnected start"); + mService = ((FmRadioService.ServiceBinder) service).getService(); + if (null == mService) { + Log.e(TAG, "ServiceConnection: Error: can't get Service"); + finish(); + return; + } + + mService.registerFmRadioListener(mFmRadioListener); + if (!mService.isServiceInited()) { + Log.d(TAG, "ServiceConnection: FM service is not init"); + mService.initService(mCurrentStation); + powerUpFm(); + } else { + Log.d(TAG, "ServiceConnection: FM service is already init"); + if (mService.isDeviceOpen()) { + + // ALPS01768123 Need to power up for this case + // Without earphone->Start FM->Click Home->Plug in earphone->Enter FM + // -> Power Menu will be power down status and disabled + // ALPS01811383 Cannot power up when in call, because cannot get AudioFocus + if (!mService.isPowerUp() && mService.isModeNormal()) { + Log.d(TAG, "Need to power up auto for this case"); + powerUpFm(); + } else if (!mService.isPowerUp() && !mService.isModeNormal()) { + // if onStop() has been called before resuming this activity during + // phone call, need check whether show no-antenna dialog. + if (!mIsNeedShowNoAntennaDlg && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + } + + // tunetostation during changing language,we need to tune + // again when service bind success + if (mNeedTuneto) { + tuneToStation(mCurrentStation); + mNeedTuneto = false; + } + updateCurrentStation(); + boolean isPlaying = mService.isPowerUp(); + // back key destroy activity, mIsPlaying will be the default + // false. + // but it may be true. so the power button will be in wrong + // state. + mIsPlaying = isPlaying; + updateMenuStatus(); + updateDialogStatus(); + + // check whether set play back button enable + if (!isRecordFileExist()) { + mButtonPlayback.setEnabled(false); + } + updateRds(); + restoreRecorderState(); + } else { + // Normal case will not come here + // Need to exit FM for this case + Log.e(TAG, "ServiceConnection: service is exiting while start FM again"); + exitService(); + finish(); + } + } + Log.d(TAG, "FmRadioActivity.onServiceConnected end"); + } + + /** + * When unbind service will call this method + * + * @param className The component name + */ + @Override + public void onServiceDisconnected(ComponentName className) { + Log.d(TAG, "FmRadioActivity.onServiceDisconnected"); + } + }; + + /** + * Update FM recording state with given state from FM service + * + * @param recorderState The recorder state + */ + private void updateRecordingState(int recorderState) { + mRecordState = recorderState; + refreshRecordingStatus(recorderState); + + switch (recorderState) { + case FmRecorder.STATE_RECORDING: + showToast(getString(R.string.toast_start_recording)); + Log.d(TAG, "updateRecordingState:startRecording"); + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + break; + + case FmRecorder.STATE_PLAYBACK: + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + break; + + case FmRecorder.STATE_IDLE: + Log.d(TAG, "updateRecordingState:remove message"); + mHandler.removeMessages(FmRadioListener.MSGID_REFRESH); + break; + + default: + mHandler.removeMessages(FmRadioListener.MSGID_REFRESH); + break; + } + } + + /** + * Update FM recorder error with given error from FM service + * + * @param errorType The record error type + */ + private void updateRecorderError(int errorType) { + Log.d(TAG, "updateRecorderError.errorType: " + errorType); + String showString = null; + // In FMRecorder.startRecording() error occurs,then we should set + // mButtonRecord enable, because we set mButtonRecord disable ago + refreshRecordIdle(); + switch (errorType) { + case FmRecorder.ERROR_SDCARD_NOT_PRESENT: + showString = getString(R.string.toast_sdcard_missing); + break; + + case FmRecorder.ERROR_SDCARD_INSUFFICIENT_SPACE: + showString = getString(R.string.toast_sdcard_insufficient_space); + break; + + case FmRecorder.ERROR_RECORDER_INTERNAL: + showString = getString(R.string.toast_recorder_internal_error); + break; + + case FmRecorder.ERROR_PLAYER_INTERNAL: + showString = getString(R.string.toast_player_internal_error); + break; + + case FmRadioListener.NOT_AUDIO_FOCUS: + showString = getString(R.string.not_available); + if (isRecordFileExist()) { + refreshPlaybackIdle(true); + } + break; + case FmRecorder.ERROR_RECORDER_INVALID_STATE: + showString = getString(R.string.toast_powerup_before_record_warning); + break; + default: + Log.d(TAG, "invalid recorder error"); + break; + } + + showToast(showString); + } + + /** + * Update FM recorder mode with given mode from FM service + * + * @param isInRecordingMode The current mode, true if current is in + * recording mode + */ + private void exitRecordingMode(boolean isInRecordingMode) { + refreshImageButton(mIsPlaying); + refreshActionMenuItem(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + refreshActionMenuPower(true); + if (!isInRecordingMode) { + // Service has already set recording mode to false, need to modify + // UI here + mIsInRecordingMode = false; + switchRecordLayout(isInRecordingMode); + } + } + + /** + * Format the given time to be string by hour:minute:second + * + * @param time The time to be formated + * + * @return string The formated time + */ + private String getTimeString(int time) { + final int oneHour = 3600; + int hour = time / oneHour; + final int minuteSecond = 60; + int minute = (time / minuteSecond) % minuteSecond; + int second = time % minuteSecond; + String timeString = null; + + if (hour > 0) { + final String timeFormatLong = "%02d:%02d:%02d"; + timeString = String.format(timeFormatLong, hour, minute, second); + } else { + final String timeFormatShort = "%02d:%02d"; + timeString = String.format(timeFormatShort, minute, second); + } + + return timeString; + } + + /** + * Update the favorite UI state + */ + private void updateFavoriteStation() { + String showString = null; + // Judge the current output and switch between the devices. + if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) { + // Need to delete this favorite channel. + String stationName = FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE); + FmRadioStation.updateStationToDb(mContext, stationName, + FmRadioStation.STATION_TYPE_SEARCHED, mCurrentStation); + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + showString = mProjectStringExt.getProjectString(mContext, + R.string.toast_channel_deleted, R.string.toast_channel_deleted1); + } else { + // Add the station to favorite + String stationName = FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_SEARCHED); + if (FmRadioStation.isStationExist(mContext, mCurrentStation, + FmRadioStation.STATION_TYPE_SEARCHED)) { + FmRadioStation.updateStationToDb(mContext, stationName, + FmRadioStation.STATION_TYPE_FAVORITE, + mCurrentStation); + } else { + FmRadioStation.insertStationToDb(mContext, stationName, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE); + } + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(stationName); + showString = mProjectStringExt.getProjectString(mContext, + R.string.toast_channel_added, R.string.toast_channel_added1); + } + showToast(showString); + } + + /** + * Edit value which saved in shared preference + * + * @param key The preferences editor key + * @param time The preferences editor value + */ + private void editSharedPreferences(String key, long time) { + SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putLong(key, time); + editor.commit(); + } + + /** + * Called when the activity is first created, initial variables + * + * @param savedInstanceState The saved bundle in onSaveInstanceState + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +/* Vanzo:libing on: Thu, 15 May 2014 18:13:02 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onCreate initPsensorManager()"); + if (isFmRadioGestureSupport()) { + initPsensorManager(); + } +// End of Vanzo:libing + Log.i(TAG, "FmRadioActivity.onCreate start"); + // Bind the activity to FM audio stream. + setVolumeControlStream(AudioManager.STREAM_MUSIC); + setContentView(R.layout.main); + mFragmentManager = getFragmentManager(); + mContext = getApplicationContext(); + + FmRadioStation.initFmDatabase(mContext); + mProjectStringExt = ExtensionUtils.getExtension(mContext); + initUiComponent(); + registerButtonClickListener(); + registerSdcardReceiver(); + mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + Log.d(TAG, "FmRadioActivity.onCreate end"); + } +/* Vanzo:libing on: Thu, 15 May 2014 18:14:21 +0800 + * add for gesture + */ + public void initPsensorManager() { + return; + /*File file = new File("/sys/bus/platform/drivers/als_ps/ps"); + if (!file.exists()) { + mHavePsensor = false; + } + // has no psensor return + if (mHavePsensor == false) { + Log.w(TAG, "initPsensorManager() has no psensor !!!"); + return; + } + mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); +*/ +/* Vanzo:lupei on: Fri, 28 Aug 2015 14:51:36 +0800 + * add default gesture distance max min value + */ + /*android.util.Log.d(TAG, "DEFAULT_GESTURE_DIST_MAX_MIN = "+DEFAULT_GESTURE_DIST_MAX_MIN); + if (!("".equals(DEFAULT_GESTURE_DIST_MAX_MIN))) { + String[] value = DEFAULT_GESTURE_DIST_MAX_MIN.split(","); + if (value[0]!= "" && value[1] != "") { + GESTURE_FMRADIO_MAX_DISTANCE = Integer.parseInt(value[0]); + GESTURE_FMRADIO_MIN_DISTANCE = Integer.parseInt(value[1]); + } + }*/ +// End of Vanzo:lupei + + } + + public Runnable myRunnable = new Runnable() { + @Override + public void run() { + File file = new File("/sys/bus/platform/drivers/als_ps/ps"); + if (!file.exists()) { + file = new File("/sys/bus/platform/drivers/als_ps_cm3628/ps"); + } + if (file.exists()) { + String pSensorValues2 = readFile(file); + if (pSensorValues2.trim().contains("-")) { + return; + } + if (pSensorValues2.trim().contains("0x")) { + mPrePsensor = Integer.parseInt(pSensorValues2.trim().substring(2), 16); + } else { + mPrePsensor = Integer.parseInt(pSensorValues2.trim()); + } + android.util.Log.d(TAG, "fmradio isGestureOpen " + isGestureOpen()); + if (isGestureOpen() && isTopActivity()) { + if (mPrePsensor > GESTURE_FMRADIO_MAX_DISTANCE) { + mHadGesture = true; + } else if (mHadGesture && mPrePsensor < GESTURE_FMRADIO_MIN_DISTANCE) { + mHadGesture = false; + seekStation(mCurrentStation, true); // false: previous station + } + } + } + myHandler.postDelayed(myRunnable, GESTURE_RUN_POST_DELAY_TIME); + } + }; + + private boolean isTopActivity() { + ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + ComponentName cn = am.getRunningTasks(2).get(0).topActivity; + String topClassName = cn.getClassName(); + String myClassName = FmRadioActivity.this.getComponentName().getClassName(); + + return topClassName.equalsIgnoreCase(myClassName); + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + private static String readFile(File fn) { + FileReader f; + int len; + + f = null; + try { + f = new FileReader(fn); + String s = ""; + char[] cbuf = new char[200]; + while ((len = f.read(cbuf, 0, cbuf.length)) >= 0) { + s += String.valueOf(cbuf, 0, len); + } + return s; + } catch (IOException ex) { + return "0"; + } finally { + if (f != null) { + try { + f.close(); + } catch (IOException ex) { + return "0"; + } + } + } + } + + public void onSensorChanged(SensorEvent event) { + } + + private boolean isGestureOpen() { + mGestureEnabled = SystemProperties.getInt(GESTURE_SWITCH_FLAG , 0) == 1 ? true : false; + mFMRadioEnabled = SystemProperties.getInt(GESTURE_FMRADIO_FLAG , 0) == 1 ? true : false; + + return mGestureEnabled && mFMRadioEnabled; + } + + private void stopPsensor() { + mSensorManager.unregisterListener(this); + if (myHandler != null) { + myHandler.removeCallbacks(myRunnable); + } + } + + private void resumePsensor() { + mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); + + myHandler = new Handler(); + myHandler.post(myRunnable); + } + + public static boolean isFmRadioGestureSupport() { + boolean enable = false; //FeatureOption.VANZO_FEATURE_FM_RADIO_GESTURE; + android.util.Log.i(TAG, "isFmRadioGestureSupport enable = " + enable); + return enable; + } +// End of Vanzo:libing + /** + * Go to channel list activity + */ + private void enterChannelList() { + Log.d(TAG, "enterChannelList"); + if (mService != null) { + // AMS change the design for background start + // activity. need check app is background in app code + if (mIsActivityForeground) { + Intent intent = new Intent(); + intent.setClass(FmRadioActivity.this, FmRadioFavorite.class); + startActivityForResult(intent, REQUEST_CODE_FAVORITE); + } else { + Log.d(TAG, "enterChannelList. activity is background, not enter channel list."); + } + } + } + + /** + * Refresh the favorite button with the given station, if the station is + * favorite station, show favorite icon, else show non-favorite icon. + * + * @param station The station frequency + */ + private void refreshStationUI(int station) { + // Change the station frequency displayed. + mTextStationValue.setText(FmRadioUtils.formatStation(station)); + // Show or hide the favorite icon + if (FmRadioStation.isFavoriteStation(mContext, station)) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName(mContext, + station, FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + } + } + + @SuppressWarnings("deprecation") + private void restoreConfiguration() { + // after configuration change, need to reduction else the UI is abnormal + if (null != getLastNonConfigurationInstance()) { + Log.d(TAG, + "Configration changes,activity restart,need to reset UI!"); + Bundle bundle = (Bundle) getLastNonConfigurationInstance(); + if (null == bundle) { + return; + } + mPrevRecorderState = bundle.getInt("mPrevRecorderState"); + mRecordState = bundle.getInt("mRecordState"); + mIsNeedShowRecordDlg = bundle.getBoolean("mIsFreshRecordingStatus"); + // mIsNeedShowNoAntennaDlg = bundle.getBoolean("mIsNeedShowNoAntennaDlg"); + mIsNeedShowSearchDlg = bundle.getBoolean("mIsNeedShowSearchDlg"); + // we doesn't get it from service because the service may be + // null because not bind + mIsInRecordingMode = bundle.getBoolean("isInRecordingMode"); + mIsPlaying = bundle.getBoolean("mIsPlaying"); + Log.d(TAG, "bundle = " + bundle); + } + } + + /** + * Start and bind service, reduction variable values if configuration + * changed + */ + @Override + public void onStart() { + super.onStart(); + FmRadioService.setActivityIsOnStop(false); + Log.d(TAG, "FmRadioActivity.onStart start"); + // Should start FM service first. + if (null == startService(new Intent(FmRadioActivity.this, + FmRadioService.class))) { + Log.e(TAG, "Error: Cannot start FM service"); + return; + } + + mIsServiceStarted = true; + mIsServiceBinded = bindService(new Intent(FmRadioActivity.this, + FmRadioService.class), mServiceConnection, + Context.BIND_AUTO_CREATE); + + if (!mIsServiceBinded) { + Log.e(TAG, "Error: Cannot bind FM service"); + finish(); + return; + } + restoreConfiguration(); + Log.d(TAG, "FmRadioActivity.onStart end"); + } + + /** + * Refresh UI, when stop search, dismiss search dialog, pop up recording + * dialog if FM stopped when recording in background + */ + @Override + public void onResume() { + super.onResume(); +/* Vanzo:libing on: Thu, 15 May 2014 18:17:38 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onResume isGestureOpen = " + isGestureOpen()); + if (isFmRadioGestureSupport() && isGestureOpen()) { + resumePsensor(); + } +// End of Vanzo:libing + Log.d(TAG, "FmRadioActivity.onResume start"); + mIsActivityForeground = true; + if (null == mService) { + Log.d(TAG, "service has not bind finished"); + mIsNeedShowNoAntennaDlg = false; + return; + } + updateMenuStatus(); + updateDialogStatus(); + if (!isRecordFileExist()) { + mButtonPlayback.setEnabled(false); + } + checkNoAntennaDialogInOnResume(); + Log.d(TAG, "FmRadioActivity.onResume end"); + } + + /** + * In call and plug out earphone(in onPause state), need to show no antenna dialog but + * use mIsNeedShowNoAntennaDlg to save the state, because there is no where to show this dialog after onResume() for this case + */ + private void checkNoAntennaDialogInOnResume() { + if (mIsNeedShowNoAntennaDlg && mService != null && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + } + + /** + * When activity is paused call this method, indicate activity enter + * background if press exit, power down FM + */ + @Override + public void onPause() { + Log.d(TAG, "start FmRadioActivity.onPause"); + mIsActivityForeground = false; + /** + * Should dismiss before call onSaveInstance, or it will resume + * automatic + */ + mIsNeedShowSearchDlg = true; + dismissSearchDialog(); + + /** + * should dismiss before call onSaveInstance, or it will resume + * automatic. + */ + FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager + .findFragmentByTag(TAG_SAVE_RECORDINGD); + if (null != df && df.getShowsDialog()) { + Log.d(TAG, "onPause.dismissSaveRecordingDialog()"); + if (mService != null) { + mService.setModifiedRecordingName(df.getRecordingNameToSave()); + } + dismissSaveRecordingDialog(); + mIsNeedShowRecordDlg = true; + } + + // Need to dismiss avoid AMS popup this dialog again for power up will show this dialog + if (dismissNoAntennaDialog()) { + mIsNeedShowNoAntennaDlg = true; + } + + Log.d(TAG, "end FmRadioActivity.onPause"); + super.onPause(); + } + + /** + * Called when activity enter stopped state, unbind service, if exit + * pressed, stop service + */ + @Override + public void onStop() { + FmRadioService.setActivityIsOnStop(true); + Log.d(TAG, "start FmRadioActivity.onStop"); + if (mIsServiceBinded) { + unbindService(mServiceConnection); + mIsServiceBinded = false; + } + mIsNeedShowNoAntennaDlg = false; + Log.d(TAG, "end FmRadioActivity.onStop"); + super.onStop(); +/* Vanzo:libing on: Thu, 15 May 2014 18:15:55 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onStop stopPsensor()"); + if (isFmRadioGestureSupport()) { + stopPsensor(); + } +// End of Vanzo:libing + } + + /** + * W activity destroy, unregister broadcast receiver and remove handler + * message + */ + @Override + public void onDestroy() { + Log.d(TAG, "start FmRadioActivity.onDestroy"); + unregisterSdcardReceiver(); + // need to call this function because if doesn't do this,after + // configuration change will have many instance and recording time + // or playing time will not refresh + // Remove all the handle message + mHandler.removeCallbacksAndMessages(null); + if (mService != null) { + mService.unregisterFmRadioListener(mFmRadioListener); + } + mFmRadioListener = null; + if (null != mPopupMenu) { + mPopupMenu.dismiss(); + mPopupMenu = null; + } + Log.d(TAG, "end FmRadioActivity.onDestroy"); + super.onDestroy(); + } + + /** + * Create options menu + * + * @param menu The option menu + * + * @return true or false indicate need to handle other menu item + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + Log.d(TAG, "start FmRadioActivity.onCreateOptionsMenu"); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.fm_action_bar, menu); + mMenuItemChannelList = menu.findItem(R.id.fm_channel_list); + mMenuItemOverflow = menu.findItem(R.id.fm_menu); + mMenuItemPower = menu.findItem(R.id.fm_power); + Log.d(TAG, "end FmRadioActivity.onCreateOptionsMenu"); + return true; + } + + /** + * Prepare options menu + * + * @param menu The option menu + * + * @return true or false indicate need to handle other menu item + */ + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + Log.d(TAG, "start FmRadioActivity.onPrepareOptionsMenu"); + mMenuItemChannelList.setVisible(!mIsInRecordingMode); + mMenuItemOverflow.setVisible(!mIsInRecordingMode); + mMenuItemPower.setVisible(!mIsInRecordingMode); + if (null == mService) { + Log.d(TAG, "mService is null"); + return !mIsInRecordingMode; + } + + boolean isPlaying = mService.isPowerUp(); + boolean isMakePowerdown = mService.isMakePowerDown(); + boolean isSeeking = mService.isSeeking(); + boolean isScan = mService.isScanning(); + // if fm power down by other app, should enable power menu, make it to + // powerup. + refreshActionMenuItem((isSeeking || isScan) ? false : isPlaying); + refreshActionMenuPower((isScan || isSeeking) + ? false + : (isPlaying || (isMakePowerdown && !mIsNeedDisablePower))); + + // check whether show animation + if (isSeeking) { + Log.d(TAG, "onPrepareOptionsMenu: it is seeking"); + startAnimation(); + } + + Log.d(TAG, "end FmRadioActivity.onPrepareOptionsMenu"); + return !mIsInRecordingMode; + } + + /** + * Handle event when option item selected + * + * @param item The clicked item + * + * @return true or false indicate need to handle other menu item or not + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Log.d(TAG, "start FmRadioActivity.onOptionsItemSelected"); + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + break; + + case R.id.fm_channel_list: + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + // Show favorite activity. + enterChannelList(); + break; + + case R.id.fm_power: + Log.d(TAG, "click fm_power menu"); + if (mIsPlaying) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + exitService(); + break; + } + powerUpFm(); + break; + + case R.id.fm_menu: + item.setEnabled(false); + + mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu)); + Menu menu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu); + mPopupMenu.setOnMenuItemClickListener(this); + mPopupMenu.setOnDismissListener(this); + + boolean isPlaying = mService.isPowerUp(); + if (isPlaying) { + menu.findItem(R.id.fm_record).setEnabled(true); + menu.findItem(R.id.fm_sound_mode).setEnabled(!mService.isBtConnected()); + menu.findItem(R.id.fm_sound_mode).setTitle( + mService.isSpeakerUsed() ? R.string.optmenu_earphone + : R.string.optmenu_speaker); + menu.findItem(R.id.fm_search).setEnabled(true); + } + refreshSoundModeVisiable(); + mPopupMenu.show(); + break; + + default: + Log.e(TAG, "Error: Invalid options menu item."); + break; + } + Log.d(TAG, "end FmRadioActivity.onOptionsItemSelected"); + return super.onOptionsItemSelected(item); + } + + /** + * Check whether antenna is available + * + * @return true or false indicate antenna available or not + */ + private boolean isAntennaAvailable() { + return mAudioManager.isWiredHeadsetOn(); + } + + /** + * When on activity result, tune to station which is from channel list + * + * @param requestCode The request code + * @param resultCode The result code + * @param data The intent from channel list + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (RESULT_OK == resultCode) { + if (REQUEST_CODE_FAVORITE != requestCode) { + Log.e(TAG, "Error: Invalid requestcode."); + return; + } + int iStation = data.getIntExtra( + FmRadioFavorite.ACTIVITY_RESULT, mCurrentStation); + // Tune to this station. + mCurrentStation = iStation; + // if tune from channel list, we should disable power menu, + // especially for + // power down state + mIsNeedDisablePower = true; + Log.d(TAG, "onActivityForReult:" + mIsNeedDisablePower); + if (null == mService) { + Log.d(TAG, "activity.onActivityResult mService is null"); + mNeedTuneto = true; + return; + } + tuneToStation(iStation); + return; + } + + if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName( + mContext, mCurrentStation, + FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + } + + // Do not handle other result. + Log.v(TAG, "The activity for requestcode " + requestCode + + " does not return any data."); + } + + /** + * Start animation + */ + private void startAnimation() { + mAnimImage.setAnimation(mAnimation); + mAnimImage.setVisibility(View.VISIBLE); + Log.d(TAG, "FmRadioActivity.startAnimation end"); + } + + /** + * Stop animation + */ + private void stopAnimation() { + mAnimImage.setVisibility(View.INVISIBLE); + mAnimImage.setAnimation(null); + } + + /** + * Restore recorder state from shared preference + */ + private void restoreRecorderState() { + // here should do some recorder related. + mIsInRecordingMode = mService.getRecordingMode(); + mRecordState = mService.getRecorderState(); + RelativeLayout recInfoBar = (RelativeLayout) findViewById(R.id.rl_recinfo); + // if recording or play backing state, should send message trigger + // refresh. + if ((FmRecorder.STATE_RECORDING == mRecordState) + || (FmRecorder.STATE_PLAYBACK == mRecordState)) { + SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0); + mRecordStartTime = sharedPreferences.getLong(START_RECORD_TIME, 0); + mPlayStartTime = sharedPreferences.getLong(START_PLAY_TIME, 0); + recInfoBar.setVisibility(View.VISIBLE); + Log.d(TAG, "&&&sendemptyMessage:mRecoderStart:" + mRecordStartTime); + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + } else { + recInfoBar.setVisibility(View.GONE); + } + // if remove from app list, it will make recorder ui confused. + switchRecordLayout(mIsInRecordingMode); + changeRecordingMode(mIsInRecordingMode); + if (mIsInRecordingMode) { + refreshRecordingStatus(FmRecorder.STATE_INVALID); + } + } + + /** + * Power up FM + */ + private void powerUpFm() { + Log.v(TAG, "start powerUpFm"); + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + startAnimation(); + mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + Log.v(TAG, "end powerUpFm"); + } + + private void setSpeakerPhoneOn(boolean isSpeaker) { + if (isSpeaker) { + Log.v(TAG, "UseSpeaker"); + mService.setSpeakerPhoneOn(true); + } else { + Log.v(TAG, "UseEarphone"); + mService.setSpeakerPhoneOn(false); + } + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_sound_mode).setTitle(mService.isSpeakerUsed() ? + R.string.optmenu_earphone : R.string.optmenu_speaker); + } + } + + /** + * Tune to a station + * + * @param station The tune station + */ + private void tuneToStation(final int station) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + mService.tuneStationAsync(FmRadioUtils.computeFrequency(station)); + if (!mIsPlaying) { + startAnimation(); + } + } + + /** + * Seek station according current frequency and direction + * + * @param station The seek start station + * @param direction The seek direction + */ + private void seekStation(final int station, boolean direction) { + // If the seek AsyncTask has been executed and not canceled, cancel it + // before start new. + startAnimation(); + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + mService.seekStationAsync(FmRadioUtils.computeFrequency(station), + direction); + } + + private void refreshImageButton(boolean enabled) { + mButtonDecrease.setEnabled(enabled); + mButtonPrevStation.setEnabled(enabled); + mButtonNextStation.setEnabled(enabled); + mButtonIncrease.setEnabled(enabled); + } + + // Refresh action menu except power menu + private void refreshActionMenuItem(boolean enabled) { + // action menu + if (null != mMenuItemChannelList) { + // if power down by other app, should disable channelist list, over + // menu + mMenuItemChannelList.setEnabled(enabled); + mMenuItemOverflow.setEnabled(enabled); + } + } + + // Refresh action menu only power menu + private void refreshActionMenuPower(boolean enabled) { + Log.d(TAG, "refreshActionMenuPower enabled:" + enabled + ", mIsPlaying:" + mIsPlaying); + // action menu + if (null != mMenuItemChannelList) { + // if fm power down by other app, should enable this button to + // powerup. + mMenuItemPower.setEnabled(enabled); + mMenuItemPower.setIcon(mIsPlaying ? R.drawable.btn_fm_powerup_selector + : R.drawable.btn_fm_powerdown_selector); + } + } + + private void refreshPopupMenuItem(boolean enabled) { + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_record).setEnabled(enabled); + menu.findItem(R.id.fm_search).setEnabled(enabled); + menu.findItem(R.id.fm_sound_mode).setEnabled(enabled && !mService.isBtConnected()); + refreshSoundModeVisiable(); + } + } + + private void refreshSoundModeVisiable() { + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + // Need hide only short antenna support and not plug in earphone + boolean hideSoundMode = SHORT_ANNTENNA_SUPPORT && !mService.isAntennaAvailable(); + boolean showSoundMode = !hideSoundMode; + menu.findItem(R.id.fm_sound_mode).setVisible(showSoundMode); + } + } + + private void refreshRecordNotIdle() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(false); + } + + private void refreshRecordIdle() { + mButtonRecord.setEnabled(true); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(false); + } + + private void refreshPlaybackIdle(boolean btnPlayBack) { + mButtonRecord.setEnabled(true); + mButtonPlayback.setEnabled(btnPlayBack); + mButtonStop.setEnabled(false); + } + + private void refreshRecording() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(true); + } + + private void refreshPlaybacking() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(true); + } + + /** + * Called when back pressed + */ + @Override + public void onBackPressed() { + Log.d(TAG, "begin FmRadioActivity.onBackPressed"); + + if (mIsInRecordingMode) { + changeRecordingMode(false); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + // no need consider power down and other situation + boolean isPlaying = mService.isPowerUp(); + refreshImageButton(isPlaying); + refreshPopupMenuItem(isPlaying); + refreshActionMenuItem(isPlaying); + refreshActionMenuPower(true); + if (mService != null && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + return; + } + + // exit fm, disable all button + if (!mIsPlaying && (null != mService) && !mService.isPowerUping()) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + exitService(); + return; + } + + super.onBackPressed(); + Log.d(TAG, "end FmRadioActivity.onBackPressed"); + } + + private void showToast(CharSequence text) { + if (null == mToast) { + mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT); + } + mToast.setText(text); + mToast.show(); + Log.v(TAG, "FmRadioActivity.showToast: toast = " + text); + } + + private void showRds(String text) { + mTextRds.setText(text); + mTextRds.setSelected(true); + Log.v(TAG, "FmRadioActivity.showRds: RDS = " + text); + } + + /** + * Change recording mode + * + * @param recordingMode The current recording mode + */ + private void changeRecordingMode(boolean recordingMode) { + Log.d(TAG, "changeRecordingMode: " + recordingMode); + if (mIsInRecordingMode == recordingMode) { + Log.e(TAG, "FM already " + (recordingMode ? "in" : "NOT in") + + "recording mode!"); + return; + } + mIsInRecordingMode = recordingMode; + mService.setRecordingModeAsync(recordingMode); + switchRecordLayout(recordingMode); + } + + /** + * Switch to record layout, if in recorder mode. + * + * @param recordingMode true in recorder mode, false not in recorder mode + */ + private void switchRecordLayout(boolean recordingMode) { + ActionBar actionBar = getActionBar(); + invalidateOptionsMenu(); + + // Set the action bar on the right to be up navigation + actionBar.setDisplayHomeAsUpEnabled(recordingMode); + actionBar.setHomeButtonEnabled(recordingMode); + actionBar.setTitle(recordingMode ? R.string.fm_recorder_name + : R.string.app_name); + + LinearLayout recBar = (LinearLayout) findViewById(R.id.bottom_bar_recorder); + LinearLayout bottomBar = (LinearLayout) findViewById(R.id.bottom_bar); + + bottomBar.setVisibility(recordingMode ? View.GONE : View.VISIBLE); + recBar.setVisibility(recordingMode ? View.VISIBLE : View.GONE); + mButtonAddToFavorite.setVisibility(recordingMode ? View.GONE + : View.VISIBLE); + } + + /** + * Update recording UI according record state + * + * @param stateOverride The recording state + */ + private void refreshRecordingStatus(int stateOverride) { + int recorderState = FmRecorder.STATE_INVALID; + + recorderState = (stateOverride == FmRecorder.STATE_INVALID ? mService + .getRecorderState() : stateOverride); + + Log.d(TAG, "refreshRecordingStatus: state=" + recorderState); + switch (recorderState) { + case FmRecorder.STATE_IDLE: + long recordTime = mService.getRecordTime(); + if (recordTime > 0) { + if (isRecordFileExist()) { + mButtonPlayback.setEnabled(true); + } + + if (FmRecorder.STATE_RECORDING == mPrevRecorderState) { + Log.d(TAG, "need show recorder dialog.mPrevRecorderState:" + + mPrevRecorderState); + if (mIsActivityForeground) { + showSaveRecordingDialog(); + } else { + mIsNeedShowRecordDlg = true; + } + } + } else { + mButtonPlayback.setEnabled(false); + } + + refreshPlaybackIdle((recordTime > 0) && isRecordFileExist()); + mRLRecordInfo.setVisibility(View.GONE); + break; + + case FmRecorder.STATE_RECORDING: + mTxtRecInfoLeft.setText(""); + mTxtRecInfoRight.setText(""); + mTxtRecInfoLeft.setSelected(false); + refreshRecording(); + mRLRecordInfo.setVisibility(View.VISIBLE); + break; + + case FmRecorder.STATE_PLAYBACK: + String recordingName = mService.getRecordingName(); + if (null == recordingName) { + recordingName = ""; + } + mTxtRecInfoLeft.setText(recordingName); + mTxtRecInfoRight.setText(""); + mTxtRecInfoLeft.setSelected(true); + refreshPlaybacking(); + mRLRecordInfo.setVisibility(View.VISIBLE); + break; + + case FmRecorder.STATE_INVALID: + refreshRecordIdle(); + mRLRecordInfo.setVisibility(View.GONE); + break; + + default: + Log.d(TAG, "invalid record status"); + break; + } + mPrevRecorderState = recorderState; + Log.d(TAG, "refreshRecordingStatus.mPrevRecorderState:" + mPrevRecorderState); + } + + /** + * Check whether FM recording temporary file exist + * + * @return true if FM recording temporary file exist, false not exist FM + * recording temporary file + */ + private boolean isRecordFileExist() { + String fileName = null; + fileName = mService.getRecordingNameWithPath(); + // if recording file is delete by user, play button disabled + File recordingFileToSave = new File(fileName + FmRecorder.RECORDING_FILE_EXTENSION); + return recordingFileToSave.exists(); + } + + /** + * use onRetainNonConfigurationInstance because after configuration change, + * activity will destroy and create need use this function to save some + * important variables + */ + @Override + public Object onRetainNonConfigurationInstance() { + final int size = 5; + Bundle bundle = new Bundle(size); + bundle.putBoolean("isInRecordingMode", mIsInRecordingMode); + bundle.putInt("mPrevRecorderState", mPrevRecorderState); + bundle.putBoolean("mIsFreshRecordingStatus", mIsNeedShowRecordDlg); + //bundle.putBoolean("mIsNeedShowNoAntennaDlg", mIsNeedShowNoAntennaDlg); + bundle.putBoolean("mIsNeedShowSearchDlg", mIsNeedShowSearchDlg); + bundle.putInt("mRecordState", mRecordState); + bundle.putBoolean("mIsPlaying", mIsPlaying); + Log.d(TAG, "onRetainNonConfigurationInstance() bundle:" + bundle); + return bundle; + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + Log.d(TAG, "onSaveInstanceState"); + super.onSaveInstanceState(outState); + } + + /** + * Handle event about pop up menu clicked + * + * @param item The pop up menu item + * + * @return true or false indicate need to handle other menu item or not + */ + @Override + public boolean onMenuItemClick(MenuItem item) { + Log.d(TAG, "onMenuItemClick:" + item.getItemId()); + switch (item.getItemId()) { + case R.id.fm_search: + // Don't show search dialog when activity is background + if (!mIsActivityForeground) { + Log.w(TAG, "click searh menu in background, don't show search dialog"); + return false; + } + mIsNeedShowSearchDlg = true; + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + showSearchDialog(); + FmRadioStation.cleanSearchedStations(mContext); + mService.startScanAsync(); + break; + + case R.id.fm_sound_mode: + setSpeakerPhoneOn(!mService.isSpeakerUsed()); + break; + + case R.id.fm_record: + changeRecordingMode(true); + refreshRecordingStatus(FmRecorder.STATE_INVALID); + break; + + default: + Log.d(TAG, "invalid menu item"); + break; + } + return false; + } + + /** + * Called when PopUp menu dismissed + * + * @param PopUp The menu which dismiss + */ + @Override + public void onDismiss(PopupMenu menu) { + Log.d(TAG, "popmenu dismiss listener:" + menu); + invalidateOptionsMenu(); + } + + /** + * Exit FM service + */ + private void exitService() { + Log.i(TAG, "exitService"); + if (mIsServiceBinded) { + unbindService(mServiceConnection); + mIsServiceBinded = false; + } + + if (mIsServiceStarted) { + boolean isSuccess = stopService(new Intent( + FmRadioActivity.this, FmRadioService.class)); + if (!isSuccess) { + Log.e(TAG, "Error: Cannot stop the FM service."); + } + mIsServiceStarted = false; + } + } + + /** + * Show no antenna dialog + */ + public void showNoAntennaDialog() { + NoAntennaDialog newFragment = NoAntennaDialog.newInstance(); + newFragment.show(mFragmentManager, TAG_NO_ANTENNA); + mFragmentManager.executePendingTransactions(); + } + + /** + * Show save recording dialog + * + * @param name The recording file name + */ + public void showSaveRecordingDialog() { + String sdcard = FmRadioService.getRecordingSdcard(); + String defaultName = mService.getRecordingName(); + String recordingName = mService.getModifiedRecordingName(); + FmRecordDialogFragment newFragment = + new FmRecordDialogFragment(sdcard, defaultName, recordingName); + newFragment.show(mFragmentManager, TAG_SAVE_RECORDINGD); + mFragmentManager.executePendingTransactions(); + } + + /** + * Show search dialog + */ + private void showSearchDialog() { + SearchChannelsDialog newFragment = SearchChannelsDialog.newInstance(); + newFragment.show(mFragmentManager, TAG_SEARCH); + mFragmentManager.executePendingTransactions(); + } + + /** + * Dismiss search dialog + */ + private void dismissSearchDialog() { + SearchChannelsDialog newFragment = (SearchChannelsDialog) mFragmentManager + .findFragmentByTag(TAG_SEARCH); + if (null != newFragment) { + newFragment.dismissAllowingStateLoss(); + } + } + + /** + * Dismiss save recording dialog + */ + private void dismissSaveRecordingDialog() { + FragmentTransaction ft = mFragmentManager.beginTransaction(); + Fragment fragment = mFragmentManager.findFragmentByTag(TAG_SAVE_RECORDINGD); + if (null != fragment) { + ft.remove(fragment); + ft.commitAllowingStateLoss(); + } + } + + /** + * Check whether recording card is unmounted + * + * @param intent The intent about sdcard + * + * @return true or false indicate recording card unmount or not + */ + private boolean isRecordingCardUnmount(Intent intent) { + String sdcard = FmRadioService.getRecordingSdcard(); + String unmountSDCard = intent.getData().toString(); + Log.d(TAG, "unmount sd card file path: " + unmountSDCard); + return unmountSDCard.equalsIgnoreCase("file://" + sdcard) ? true + : false; + } + + /** + * Dismiss no antenna dialog + */ + private boolean dismissNoAntennaDialog() { + NoAntennaDialog newFragment = (NoAntennaDialog) mFragmentManager + .findFragmentByTag(TAG_NO_ANTENNA); + if (null != newFragment) { + newFragment.dismissAllowingStateLoss(); + return true; + } + return false; + } + + /** + * Cancel search progress + */ + public void cancelSearch() { + Log.d(TAG, "FmRadioActivity.cancelSearch"); + mService.stopScan(); + } + + /** + * No antenna continue to operate + */ + @Override + public void noAntennaContinue() { + // We let user use the app if no antenna. + // But we do not automatically start FM. + Log.d(TAG, " noAntennaContinue.onClick ok to continue"); + if (isAntennaAvailable()) { + powerUpFm(); + } else { + Log.d(TAG, "noAntennaContinue.earphone is not ready"); + mService.switchAntennaAsync(1); + } + } + + /** + * No antenna cancel to operate + */ + @Override + public void noAntennaCancel() { + Log.d(TAG, " onClick Negative"); + if (mService != null && !mService.isInLockTaskMode()) { + exitService(); + } else { + Log.d(TAG, "No need exit Service and Activity cause current is lock mode"); + } + } + + /** + * Recording dialog click + * + * @param recordingName The new recording name + */ + @Override + public void onRecordingDialogClick(String recordingName) { + mService.saveRecordingAsync(recordingName); + mService.setModifiedRecordingName(null); + } + + /** + * Update rds information + */ + private void updateRds() { + if (mIsPlaying) { + Bundle bundle = new Bundle(2); + bundle.putString(FmRadioListener.KEY_PS_INFO, mService.getPS()); + bundle.putString(FmRadioListener.KEY_RT_INFO, mService.getLRText()); + Message msg = mHandler + .obtainMessage(FmRadioListener.LISTEN_PS_CHANGED); + msg.setData(bundle); + mHandler.sendMessage(msg); + } + } + + /** + * Update current station according service station + */ + private void updateCurrentStation() { + // get the frequency from service, set frequency in activity, UI, + // database + // same as the frequency in service + int freq = mService.getFrequency(); + if (FmRadioUtils.isValidStation(freq)) { + if (mCurrentStation != freq) { + Log.d(TAG, "frequency in service isn't same as in database"); + mCurrentStation = freq; + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + refreshStationUI(mCurrentStation); + } + } + } + + /** + * Update button status, and dialog status + */ + private void updateDialogStatus() { + Log.d(TAG, "updateDialogStatus.mIsNeedShowSearchDlg:" + mIsNeedShowSearchDlg); + boolean isScan = mService.isScanning(); + // check whether show search dialog, because it may be dismissed + // onSaveInstance + if (isScan && mIsNeedShowSearchDlg) { + Log.d(TAG, "updateDialogStatus: show search dialog. isScan is " + isScan); + mIsNeedShowSearchDlg = false; + showSearchDialog(); + } + + // check whether show recorder dialog, when activity is foreground + if (mIsNeedShowRecordDlg) { + Log.d(TAG, "updateDialogStatus.resume recordDlg.mPrevRecorderState:" + + mPrevRecorderState); + showSaveRecordingDialog(); + mIsNeedShowRecordDlg = false; + } + + /* + // check whether show no antenna dialog, when activity is foreground + if (mIsNeedShowNoAntennaDlg) { + Log.d(TAG, "updateDialogStatus.resume noAntennaDlg:"); + showNoAntennaDialog(); + refreshActionMenuPower(true); + mIsNeedShowNoAntennaDlg = false; + } + */ + } + + /** + * Update menu status, and animation + */ + private void updateMenuStatus() { + boolean isPlaying = mService.isPowerUp(); + boolean isPoweruping = mService.isPowerUping(); + boolean isSeeking = mService.isSeeking(); + boolean isScan = mService.isScanning(); + boolean isMakePowerdown = mService.isMakePowerDown(); + Log.d(TAG, "updateMenuStatus.isSeeking:" + isSeeking); + boolean fmStatus = (isScan || isSeeking || isPoweruping); + // when seeking, all button should disabled, + // else should update as origin status + refreshImageButton(fmStatus ? false : isPlaying); + refreshPopupMenuItem(fmStatus ? false : isPlaying); + refreshActionMenuItem(fmStatus ? false : isPlaying); + // if fm power down by other app, should enable power button + // to powerup. + Log.d(TAG, "updateMenuStatus.mIsNeedDisablePower: " + mIsNeedDisablePower); + refreshActionMenuPower(fmStatus ? false : + (isPlaying || (isMakePowerdown && !mIsNeedDisablePower))); + + // check whether show animation + if (isSeeking || isPoweruping) { + Log.d(TAG, "updateMenuStatus. it is seeking or poweruping"); + startAnimation(); + } + } + + private void initUiComponent() { + Log.i(TAG, "initUIComponent"); + mTextRds = (TextView) findViewById(R.id.text_rds); + mTextRds.setText(""); + mTextFm = (TextView) findViewById(R.id.text_fm); + mTextFm.setText(FM); + mTextMHz = (TextView) findViewById(R.id.text_mhz); + mTextMHz.setText(R.string.fm_unit); + + mTextStationValue = (TextView) findViewById(R.id.station_value); + mTxtRecInfoLeft = (TextView) findViewById(R.id.txtRecInfoLeft); + mTxtRecInfoRight = (TextView) findViewById(R.id.txtRecInfoRight); + mRLRecordInfo = (RelativeLayout) findViewById(R.id.rl_recinfo); + mButtonRecord = (ImageButton) findViewById(R.id.btn_record); + mButtonStop = (ImageButton) findViewById(R.id.btn_stop); + mButtonPlayback = (ImageButton) findViewById(R.id.btn_playback); + mButtonAddToFavorite = (ImageButton) findViewById(R.id.button_add_to_favorite); + mTextStationName = (TextView) findViewById(R.id.station_name); + mButtonDecrease = (ImageButton) findViewById(R.id.button_decrease); + mButtonIncrease = (ImageButton) findViewById(R.id.button_increase); + mButtonPrevStation = (ImageButton) findViewById(R.id.button_prevstation); + mButtonNextStation = (ImageButton) findViewById(R.id.button_nextstation); + + // initial mPopupMenu + mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu)); + Menu menu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu); + + // put favorite button here since it might be used very early in + // changing recording mode + mCurrentStation = FmRadioStation.getCurrentStation(mContext); + boolean isFavoriteStation = FmRadioStation.isFavoriteStation(mContext, + mCurrentStation); + // If the current station is in favorite, set its icon to favorite icon; + // else, set to none favorite icon. + if (isFavoriteStation) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + } + + mTextStationValue.setText(FmRadioUtils.formatStation(mCurrentStation)); + mAnimation = (Animation) AnimationUtils.loadAnimation(this, + R.drawable.anim); + mAnimImage = (ImageView) findViewById(R.id.iv_anim); + mAnimImage.setVisibility(View.INVISIBLE); + } + + private void registerButtonClickListener() { + mButtonRecord.setOnClickListener(mButtonClickListener); + mButtonStop.setOnClickListener(mButtonClickListener); + mButtonPlayback.setOnClickListener(mButtonClickListener); + mButtonAddToFavorite.setOnClickListener(mButtonClickListener); + mButtonDecrease.setOnClickListener(mButtonClickListener); + mButtonIncrease.setOnClickListener(mButtonClickListener); + mButtonPrevStation.setOnClickListener(mButtonClickListener); + mButtonNextStation.setOnClickListener(mButtonClickListener); + } + + private void registerSdcardReceiver() { + IntentFilter iFilter = new IntentFilter(); + iFilter.addAction(Intent.ACTION_MEDIA_EJECT); + iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); + iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); + iFilter.addDataScheme("file"); + registerReceiver(mSdcardListener, iFilter); + } + + private void unregisterSdcardReceiver() { + unregisterReceiver(mSdcardListener); + } + + private void refreshTimeText() { + Log.d(TAG, "refreshTimeText:mRecordState:" + mRecordState); + if (!mIsInRecordingMode) { + Log.d(TAG, "refreshTimeText:mIsInRecordingMode:" + mIsInRecordingMode); + if (mRecordState == FmRecorder.STATE_RECORDING) { + mService.stopRecordingAsync(); + } else if (mRecordState == FmRecorder.STATE_PLAYBACK) { + mService.stopPlaybackAsync(); + } + return; + } + + final int oneSecond = 1000; + switch (mRecordState) { + case FmRecorder.STATE_RECORDING: + int recordTime = (int) ((SystemClock.elapsedRealtime() - mRecordStartTime) / + oneSecond); + mTxtRecInfoLeft.setText(getTimeString(recordTime)); + Log.d(TAG, "Recording time = " + mTxtRecInfoLeft.getText()); + String recordingSdcard = FmRadioService.getRecordingSdcard(); + if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) { + // recordTime 1s to avoid start() then quickly stop() native exception + if (recordTime > 1) { + // Insufficient storage + mService.stopRecordingAsync(); + } + } + break; + + case FmRecorder.STATE_PLAYBACK: + int playTime = (int) ((SystemClock.elapsedRealtime() - mPlayStartTime) / oneSecond); + mTxtRecInfoRight.setText(getTimeString(playTime)); + Log.d(TAG, "Playing time = " + mTxtRecInfoRight.getText()); + break; + + default: + break; + } + mHandler.sendEmptyMessageDelayed(FmRadioListener.MSGID_REFRESH, oneSecond); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~ new file mode 100755 index 0000000..37ddfdd --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioActivity.java~ @@ -0,0 +1,2196 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.SystemClock; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnDismissListener; +import android.widget.PopupMenu.OnMenuItemClickListener; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.mediatek.fmradio.dialogs.NoAntennaDialog; +import com.mediatek.fmradio.dialogs.SearchChannelsDialog; +import com.mediatek.fmradio.ext.IProjectStringExt; + +import java.io.File; +/* Vanzo:libing on: Thu, 15 May 2014 19:34:51 +0800 + */ +import java.io.FileReader; +import java.io.IOException; +import android.app.ActivityManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.SystemProperties; +//import com.android.featureoption.FeatureOption; +// End of Vanzo:libing + +/** + * This class interact with user, provider FM basic function and FM recording + * function + */ +public class FmRadioActivity extends Activity implements +/* Vanzo:libing on: Thu, 15 May 2014 19:36:32 +0800 + */ + SensorEventListener, +// End of Vanzo:libing + OnMenuItemClickListener, OnDismissListener, + NoAntennaDialog.NoAntennaListener, + SearchChannelsDialog.CancelSearchListener, + FmRecordDialogFragment.OnRecordingDialogClickListener { + // Logging + private static final String TAG = "FmRx/Activity"; + + // Dialog tags + private static final String TAG_SEARCH = "Search"; + private static final String TAG_SAVE_RECORDINGD = "SaveRecording"; + private static final String TAG_NO_ANTENNA = "NoAntenna"; + + // Use shared preference to store record or play time + private static final String REFS_NAME = "FMRecord"; + private static final String START_RECORD_TIME = "startRecordTime"; + private static final String START_PLAY_TIME = "startPlayTime"; + + // Request code + private static final int REQUEST_CODE_FAVORITE = 1; + + // FM + private static final String FM = "FM"; + // Short antenna support + private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport(); + + // UI views + private TextView mTextStationName = null; + private TextView mTextStationValue = null; + // RDS text view + private TextView mTextRds = null; + // Text view display "FM" + private TextView mTextFm = null; + // Text View display "MHZ" + private TextView mTextMHz = null; + private TextView mTxtRecInfoLeft = null; + private TextView mTxtRecInfoRight = null; + private ImageButton mButtonDecrease = null; + private ImageButton mButtonPrevStation = null; + private ImageButton mButtonNextStation = null; + private ImageButton mButtonIncrease = null; + private ImageButton mButtonAddToFavorite = null; + private ImageButton mButtonRecord = null; + private ImageButton mButtonStop = null; + private ImageButton mButtonPlayback = null; + private Animation mAnimation = null; + private ImageView mAnimImage = null; + + // Layout display recording file information + private RelativeLayout mRLRecordInfo = null; + + // Menu items + private MenuItem mMenuItemChannelList = null; + private MenuItem mMenuItemOverflow = null; + private MenuItem mMenuItemPower = null; + private PopupMenu mPopupMenu = null; + + // State variables + private boolean mIsServiceStarted = false; + private boolean mIsServiceBinded = false; + private boolean mNeedTuneto = false; + private boolean mIsNeedDisablePower = false; + private boolean mIsPlaying = false; + private boolean mIsInRecordingMode = false; + private boolean mIsNeedShowRecordDlg = false; + private boolean mIsNeedShowNoAntennaDlg = false; + private boolean mIsNeedShowSearchDlg = true; + private boolean mIsActivityForeground = true; + + // Record variables + private long mRecordStartTime = 0; + private long mPlayStartTime = 0; + private int mPrevRecorderState = FmRecorder.STATE_INVALID; + private int mCurrentStation = FmRadioUtils.DEFAULT_STATION; + private int mRecordState = 0; + + // Instance variables + private FmRadioService mService = null; + private Context mContext = null; + private Toast mToast = null; + private FragmentManager mFragmentManager = null; + private AudioManager mAudioManager = null; + + // Plugin + private IProjectStringExt mProjectStringExt = null; +/* Vanzo:libing on: Fri, 02 Aug 2013 15:31:08 +0800 + */ + private static final String GESTURE_SWITCH_FLAG = "persist.sys.gesture_switch"; + private static final String GESTURE_FMRADIO_FLAG = "persist.sys.gesture_fmradio"; + + // 1.first psensor value large than the GESTURE_FMRADIO_MAX_DISTANCE + private static int GESTURE_FMRADIO_MAX_DISTANCE = 350; + // 2.second psensor value small than the GESTURE_FMRADIO_MIN_DISTANCE + private static int GESTURE_FMRADIO_MIN_DISTANCE = 150; + // delay time of the gesture run hander,200 is 0.2s + private static final int GESTURE_RUN_POST_DELAY_TIME = 200; + private SensorManager mSensorManager; + private Sensor mSensor = null; + private Handler myHandler; + private int mPrePsensor = 0; + + private boolean mGestureEnabled; + private boolean mFMRadioEnabled; + private boolean mHavePsensor = true; + private boolean mHadGesture = false; +// end of vanzo:libing +/* Vanzo:lupei on: Fri, 28 Aug 2015 14:50:36 +0800 + * add default gesture distance max min value + */ + //private String DEFAULT_GESTURE_DIST_MAX_MIN = com.android.featureoption.FeatureOption.VANZO_FEATURE_DEFAULT_GESTURE_DISTANCE_MAX_MIN_VALUE; +// End of Vanzo:lupei + + // Service listener + private FmRadioListener mFmRadioListener = new FmRadioListener() { + @Override + public void onCallBack(Bundle bundle) { + int flag = bundle.getInt(FmRadioListener.CALLBACK_FLAG); + Log.d(TAG, "call back method flag:" + flag); + + if (flag == FmRadioListener.MSGID_FM_EXIT) { + mHandler.removeCallbacksAndMessages(null); + } + + // remove tag message first, avoid too many same messages in queue. + Message msg = mHandler.obtainMessage(flag); + msg.setData(bundle); + mHandler.removeMessages(flag); + mHandler.sendMessage(msg); + } + }; + + // Handle sdcard unmount event + private final BroadcastReceiver mSdcardListener = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + + if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { + Log.d(TAG, "Sd card mounted"); + return; + } + + // If not unmount recording sd card, do nothing; + if (!isRecordingCardUnmount(intent)) { + return; + } + + if (Intent.ACTION_MEDIA_EJECT.equals(action) + || Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager + .findFragmentByTag(TAG_SAVE_RECORDINGD); + if ((null != df && df.getShowsDialog()) || mIsNeedShowRecordDlg) { + Log.d(TAG, "recording sd card unmounted,dismiss save dialog"); + dismissSaveRecordingDialog(); + mIsNeedShowRecordDlg = false; + showToast(getString(R.string.toast_recording_lost_warning)); + } + Log.d(TAG, "Sd card Eject or unmounted"); + } + } + }; + + // Button click listeners on UI + private final View.OnClickListener mButtonClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_record: + // if power up, record FM, else toast prompt user to power up + Log.d(TAG, "btn record: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + if (!mIsPlaying) { + showToast(getString(R.string.toast_powerup_before_record_warning)); + return; + } + refreshRecordNotIdle(); + mRecordStartTime = SystemClock.elapsedRealtime(); + editSharedPreferences(START_RECORD_TIME, mRecordStartTime); + mService.startRecordingAsync(); + mService.setModifiedRecordingName(null); + break; + + case R.id.btn_stop: + // stop record and stop play record file + Log.d(TAG, "btn stop: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + refreshRecordNotIdle(); + mService.stopRecordingAsync(); + mService.stopPlaybackAsync(); + break; + + case R.id.btn_playback: + Log.d(TAG, "btn playback: CLICK!!"); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + refreshRecordNotIdle(); + mPlayStartTime = SystemClock.elapsedRealtime(); + editSharedPreferences(START_PLAY_TIME, mPlayStartTime); + mService.startPlaybackAsync(); + break; + + case R.id.button_add_to_favorite: + Log.d(TAG, "onClick AddToFavorite start"); + updateFavoriteStation(); + Log.d(TAG, "onClick AddToFavorite end"); + break; + + case R.id.button_decrease: + tuneToStation(FmRadioUtils.computeDecreaseStation(mCurrentStation)); + break; + + case R.id.button_increase: + tuneToStation(FmRadioUtils.computeIncreaseStation(mCurrentStation)); + break; + + case R.id.button_prevstation: + Log.d(TAG, "onClick PrevStation"); + // Search for the previous station. + seekStation(mCurrentStation, false); // false: previous station + // true: next station + break; + + case R.id.button_nextstation: + // Search for the next station. + seekStation(mCurrentStation, true); // false: previous station + // true: next station + break; + + default: + Log.d(TAG, "invalid view id"); + break; + } + } + }; + + /** + * Main thread handler to update UI + */ + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + Log.d(TAG, "mHandler.handleMessage: what = " + msg.what + + ",hashcode:" + mHandler.hashCode()); + Bundle bundle; + switch (msg.what) { + case FmRadioListener.MSGID_REFRESH: + refreshTimeText(); + break; + + case FmRadioListener.MSGID_POWERUP_FINISHED: + bundle = msg.getData(); + boolean isPowerup = bundle + .getBoolean(FmRadioListener.KEY_IS_POWER_UP); + mIsPlaying = isPowerup; + Log.d(TAG, "updateFMState: FMRadio is powerup = " + isPowerup); + stopAnimation(); + if (isPowerup) { + refreshImageButton(true); + refreshPopupMenuItem(true); + refreshActionMenuItem(true); + } else { + showToast(getString(R.string.not_available)); + } + // if not powerup success, refresh power to enable. + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_SWITCH_ANNTENNA: + bundle = msg.getData(); + boolean isSwitch = bundle + .getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA); + Log.d(TAG, "[FmRadioActivity.mHandler] swtich antenna: " + isSwitch); + if (!isSwitch) { + if (mIsActivityForeground) { + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } else { + Log.d(TAG, "need show no antenna dialog after onResume:"); + mIsNeedShowNoAntennaDlg = true; + } + stopAnimation(); + // if not powerup success, refresh power to enable. + refreshActionMenuPower(true); + } else { + mIsNeedShowNoAntennaDlg = false; + dismissNoAntennaDialog(); + } + break; + + case FmRadioListener.MSGID_POWERDOWN_FINISHED: + bundle = msg.getData(); + boolean isPowerdown = bundle + .getBoolean(FmRadioListener.KEY_IS_POWER_DOWN); + mIsPlaying = !isPowerdown; + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_TUNE_FINISHED: + bundle = msg.getData(); + boolean tuneFinish = bundle.getBoolean(FmRadioListener.KEY_IS_TUNE); + boolean isPowerUp = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP); + // when power down state, tune from channel list, + // will call back send mIsPowerup state. + mIsPlaying = mIsPlaying ? mIsPlaying : isPowerUp; + + stopAnimation(); + // tune finished, should make power enable + mIsNeedDisablePower = false; + float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION); + mCurrentStation = FmRadioUtils.computeStation(frequency); + // After tune to station finished, refresh favorite button and + // other button status. + refreshStationUI(mCurrentStation); + // tune fail,should resume button status + if (!tuneFinish) { + Log.d(TAG, "mHandler.tune: " + tuneFinish); + refreshActionMenuItem(mIsPlaying); + refreshImageButton(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + refreshActionMenuPower(true); + return; + } + refreshImageButton(true); + refreshActionMenuItem(true); + refreshPopupMenuItem(true); + refreshActionMenuPower(true); + break; + + case FmRadioListener.MSGID_SCAN_FINISHED: + bundle = msg.getData(); + // cancel scan happen + boolean isScan = bundle.getBoolean(FmRadioListener.KEY_IS_SCAN); + int tuneToStation = bundle.getInt(FmRadioListener.KEY_TUNE_TO_STATION); + int searchedNum = bundle.getInt(FmRadioListener.KEY_STATION_NUM); + refreshActionMenuItem(mIsPlaying); + refreshImageButton(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + // ebable action menu power items + refreshActionMenuPower(true); + + if (!isScan) { + dismissSearchDialog(); + Log.d(TAG, "mHandler.scan canceled. not enter to channel list."); + return; + } + + mCurrentStation = tuneToStation; + // After tune to station finished, refresh favorite button and + // other button status. + refreshStationUI(mCurrentStation); + dismissSearchDialog(); + + if (searchedNum == 0) { + showToast(getString(R.string.toast_cannot_search)); + return; + } + + enterChannelList(); + // Show toast to tell user how many stations have been searched + showToast(getString(R.string.toast_channel_searched) + " " + + String.valueOf(searchedNum)); + break; + + case FmRadioListener.MSGID_FM_EXIT: + finish(); + break; + + case FmRadioListener.LISTEN_RDSSTATION_CHANGED: + bundle = msg.getData(); + int rdsStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION); + refreshStationUI(rdsStation); + break; + + case FmRadioListener.LISTEN_PS_CHANGED: + case FmRadioListener.LISTEN_RT_CHANGED: + bundle = msg.getData(); + String text = ""; + String psString = bundle.getString(FmRadioListener.KEY_PS_INFO); + String rtString = bundle.getString(FmRadioListener.KEY_RT_INFO); + if ((null != psString) && (psString.length() > 0)) { + text += psString; + } + if ((null != rtString) && (rtString.length() > 0)) { + if (text.length() > 0) { + text += " "; + } + text += rtString; + } + showRds(text); + break; + + case FmRadioListener.LISTEN_RECORDSTATE_CHANGED: + bundle = msg.getData(); + int recorderState = bundle + .getInt(FmRadioListener.KEY_RECORDING_STATE); + Log.d(TAG, "FmRadioActivity.mHandler: recorderState = " + + recorderState); + updateRecordingState(recorderState); + break; + + case FmRadioListener.LISTEN_RECORDERROR: + bundle = msg.getData(); + int errorState = bundle + .getInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE); + updateRecorderError(errorState); + break; + + case FmRadioListener.LISTEN_RECORDMODE_CHANGED: + bundle = msg.getData(); + boolean isInRecordingMode = bundle + .getBoolean(FmRadioListener.KEY_IS_RECORDING_MODE); + exitRecordingMode(isInRecordingMode); + break; + + case FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED: + bundle = msg.getData(); + boolean isSpeakerMode = bundle + .getBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE); + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_sound_mode).setTitle(isSpeakerMode ? + R.string.optmenu_earphone : R.string.optmenu_speaker); + refreshSoundModeVisiable(); + } + break; + + default: + Log.d(TAG, "invalid message"); + break; + } + Log.d(TAG, "handleMessage"); + } + }; + + // When call bind service, it will call service connect. register call back + // listener and initial device + private final ServiceConnection mServiceConnection = new ServiceConnection() { + + /** + * called by system when bind service + * + * @param className component name + * @param service service binder + */ + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + Log.d(TAG, "FmRadioActivity.onServiceConnected start"); + mService = ((FmRadioService.ServiceBinder) service).getService(); + if (null == mService) { + Log.e(TAG, "ServiceConnection: Error: can't get Service"); + finish(); + return; + } + + mService.registerFmRadioListener(mFmRadioListener); + if (!mService.isServiceInited()) { + Log.d(TAG, "ServiceConnection: FM service is not init"); + mService.initService(mCurrentStation); + powerUpFm(); + } else { + Log.d(TAG, "ServiceConnection: FM service is already init"); + if (mService.isDeviceOpen()) { + + // ALPS01768123 Need to power up for this case + // Without earphone->Start FM->Click Home->Plug in earphone->Enter FM + // -> Power Menu will be power down status and disabled + // ALPS01811383 Cannot power up when in call, because cannot get AudioFocus + if (!mService.isPowerUp() && mService.isModeNormal()) { + Log.d(TAG, "Need to power up auto for this case"); + powerUpFm(); + } else if (!mService.isPowerUp() && !mService.isModeNormal()) { + // if onStop() has been called before resuming this activity during + // phone call, need check whether show no-antenna dialog. + if (!mIsNeedShowNoAntennaDlg && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + } + + // tunetostation during changing language,we need to tune + // again when service bind success + if (mNeedTuneto) { + tuneToStation(mCurrentStation); + mNeedTuneto = false; + } + updateCurrentStation(); + boolean isPlaying = mService.isPowerUp(); + // back key destroy activity, mIsPlaying will be the default + // false. + // but it may be true. so the power button will be in wrong + // state. + mIsPlaying = isPlaying; + updateMenuStatus(); + updateDialogStatus(); + + // check whether set play back button enable + if (!isRecordFileExist()) { + mButtonPlayback.setEnabled(false); + } + updateRds(); + restoreRecorderState(); + } else { + // Normal case will not come here + // Need to exit FM for this case + Log.e(TAG, "ServiceConnection: service is exiting while start FM again"); + exitService(); + finish(); + } + } + Log.d(TAG, "FmRadioActivity.onServiceConnected end"); + } + + /** + * When unbind service will call this method + * + * @param className The component name + */ + @Override + public void onServiceDisconnected(ComponentName className) { + Log.d(TAG, "FmRadioActivity.onServiceDisconnected"); + } + }; + + /** + * Update FM recording state with given state from FM service + * + * @param recorderState The recorder state + */ + private void updateRecordingState(int recorderState) { + mRecordState = recorderState; + refreshRecordingStatus(recorderState); + + switch (recorderState) { + case FmRecorder.STATE_RECORDING: + showToast(getString(R.string.toast_start_recording)); + Log.d(TAG, "updateRecordingState:startRecording"); + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + break; + + case FmRecorder.STATE_PLAYBACK: + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + break; + + case FmRecorder.STATE_IDLE: + Log.d(TAG, "updateRecordingState:remove message"); + mHandler.removeMessages(FmRadioListener.MSGID_REFRESH); + break; + + default: + mHandler.removeMessages(FmRadioListener.MSGID_REFRESH); + break; + } + } + + /** + * Update FM recorder error with given error from FM service + * + * @param errorType The record error type + */ + private void updateRecorderError(int errorType) { + Log.d(TAG, "updateRecorderError.errorType: " + errorType); + String showString = null; + // In FMRecorder.startRecording() error occurs,then we should set + // mButtonRecord enable, because we set mButtonRecord disable ago + refreshRecordIdle(); + switch (errorType) { + case FmRecorder.ERROR_SDCARD_NOT_PRESENT: + showString = getString(R.string.toast_sdcard_missing); + break; + + case FmRecorder.ERROR_SDCARD_INSUFFICIENT_SPACE: + showString = getString(R.string.toast_sdcard_insufficient_space); + break; + + case FmRecorder.ERROR_RECORDER_INTERNAL: + showString = getString(R.string.toast_recorder_internal_error); + break; + + case FmRecorder.ERROR_PLAYER_INTERNAL: + showString = getString(R.string.toast_player_internal_error); + break; + + case FmRadioListener.NOT_AUDIO_FOCUS: + showString = getString(R.string.not_available); + if (isRecordFileExist()) { + refreshPlaybackIdle(true); + } + break; + case FmRecorder.ERROR_RECORDER_INVALID_STATE: + showString = getString(R.string.toast_powerup_before_record_warning); + break; + default: + Log.d(TAG, "invalid recorder error"); + break; + } + + showToast(showString); + } + + /** + * Update FM recorder mode with given mode from FM service + * + * @param isInRecordingMode The current mode, true if current is in + * recording mode + */ + private void exitRecordingMode(boolean isInRecordingMode) { + refreshImageButton(mIsPlaying); + refreshActionMenuItem(mIsPlaying); + refreshPopupMenuItem(mIsPlaying); + refreshActionMenuPower(true); + if (!isInRecordingMode) { + // Service has already set recording mode to false, need to modify + // UI here + mIsInRecordingMode = false; + switchRecordLayout(isInRecordingMode); + } + } + + /** + * Format the given time to be string by hour:minute:second + * + * @param time The time to be formated + * + * @return string The formated time + */ + private String getTimeString(int time) { + final int oneHour = 3600; + int hour = time / oneHour; + final int minuteSecond = 60; + int minute = (time / minuteSecond) % minuteSecond; + int second = time % minuteSecond; + String timeString = null; + + if (hour > 0) { + final String timeFormatLong = "%02d:%02d:%02d"; + timeString = String.format(timeFormatLong, hour, minute, second); + } else { + final String timeFormatShort = "%02d:%02d"; + timeString = String.format(timeFormatShort, minute, second); + } + + return timeString; + } + + /** + * Update the favorite UI state + */ + private void updateFavoriteStation() { + String showString = null; + // Judge the current output and switch between the devices. + if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) { + // Need to delete this favorite channel. + String stationName = FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE); + FmRadioStation.updateStationToDb(mContext, stationName, + FmRadioStation.STATION_TYPE_SEARCHED, mCurrentStation); + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + showString = mProjectStringExt.getProjectString(mContext, + R.string.toast_channel_deleted, R.string.toast_channel_deleted1); + } else { + // Add the station to favorite + String stationName = FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_SEARCHED); + if (FmRadioStation.isStationExist(mContext, mCurrentStation, + FmRadioStation.STATION_TYPE_SEARCHED)) { + FmRadioStation.updateStationToDb(mContext, stationName, + FmRadioStation.STATION_TYPE_FAVORITE, + mCurrentStation); + } else { + FmRadioStation.insertStationToDb(mContext, stationName, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE); + } + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(stationName); + showString = mProjectStringExt.getProjectString(mContext, + R.string.toast_channel_added, R.string.toast_channel_added1); + } + showToast(showString); + } + + /** + * Edit value which saved in shared preference + * + * @param key The preferences editor key + * @param time The preferences editor value + */ + private void editSharedPreferences(String key, long time) { + SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putLong(key, time); + editor.commit(); + } + + /** + * Called when the activity is first created, initial variables + * + * @param savedInstanceState The saved bundle in onSaveInstanceState + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +/* Vanzo:libing on: Thu, 15 May 2014 18:13:02 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onCreate initPsensorManager()"); + if (isFmRadioGestureSupport()) { + initPsensorManager(); + } +// End of Vanzo:libing + Log.i(TAG, "FmRadioActivity.onCreate start"); + // Bind the activity to FM audio stream. + setVolumeControlStream(AudioManager.STREAM_MUSIC); + setContentView(R.layout.main); + mFragmentManager = getFragmentManager(); + mContext = getApplicationContext(); + + FmRadioStation.initFmDatabase(mContext); + mProjectStringExt = ExtensionUtils.getExtension(mContext); + initUiComponent(); + registerButtonClickListener(); + registerSdcardReceiver(); + mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + Log.d(TAG, "FmRadioActivity.onCreate end"); + } +/* Vanzo:libing on: Thu, 15 May 2014 18:14:21 +0800 + * add for gesture + */ + public void initPsensorManager() { + return; + /*File file = new File("/sys/bus/platform/drivers/als_ps/ps"); + if (!file.exists()) { + mHavePsensor = false; + } + // has no psensor return + if (mHavePsensor == false) { + Log.w(TAG, "initPsensorManager() has no psensor !!!"); + return; + } + mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); +*/ +/* Vanzo:lupei on: Fri, 28 Aug 2015 14:51:36 +0800 + * add default gesture distance max min value + */ + /*android.util.Log.d(TAG, "DEFAULT_GESTURE_DIST_MAX_MIN = "+DEFAULT_GESTURE_DIST_MAX_MIN); + if (!("".equals(DEFAULT_GESTURE_DIST_MAX_MIN))) { + String[] value = DEFAULT_GESTURE_DIST_MAX_MIN.split(","); + if (value[0]!= "" && value[1] != "") { + GESTURE_FMRADIO_MAX_DISTANCE = Integer.parseInt(value[0]); + GESTURE_FMRADIO_MIN_DISTANCE = Integer.parseInt(value[1]); + } + }*/ +// End of Vanzo:lupei + + } + + public Runnable myRunnable = new Runnable() { + @Override + public void run() { + File file = new File("/sys/bus/platform/drivers/als_ps/ps"); + if (!file.exists()) { + file = new File("/sys/bus/platform/drivers/als_ps_cm3628/ps"); + } + if (file.exists()) { + String pSensorValues2 = readFile(file); + if (pSensorValues2.trim().contains("-")) { + return; + } + if (pSensorValues2.trim().contains("0x")) { + mPrePsensor = Integer.parseInt(pSensorValues2.trim().substring(2), 16); + } else { + mPrePsensor = Integer.parseInt(pSensorValues2.trim()); + } + android.util.Log.d(TAG, "fmradio isGestureOpen " + isGestureOpen()); + if (isGestureOpen() && isTopActivity()) { + if (mPrePsensor > GESTURE_FMRADIO_MAX_DISTANCE) { + mHadGesture = true; + } else if (mHadGesture && mPrePsensor < GESTURE_FMRADIO_MIN_DISTANCE) { + mHadGesture = false; + seekStation(mCurrentStation, true); // false: previous station + } + } + } + myHandler.postDelayed(myRunnable, GESTURE_RUN_POST_DELAY_TIME); + } + }; + + private boolean isTopActivity() { + ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + ComponentName cn = am.getRunningTasks(2).get(0).topActivity; + String topClassName = cn.getClassName(); + String myClassName = FmRadioActivity.this.getComponentName().getClassName(); + + return topClassName.equalsIgnoreCase(myClassName); + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + private static String readFile(File fn) { + FileReader f; + int len; + + f = null; + try { + f = new FileReader(fn); + String s = ""; + char[] cbuf = new char[200]; + while ((len = f.read(cbuf, 0, cbuf.length)) >= 0) { + s += String.valueOf(cbuf, 0, len); + } + return s; + } catch (IOException ex) { + return "0"; + } finally { + if (f != null) { + try { + f.close(); + } catch (IOException ex) { + return "0"; + } + } + } + } + + public void onSensorChanged(SensorEvent event) { + } + + private boolean isGestureOpen() { + mGestureEnabled = SystemProperties.getInt(GESTURE_SWITCH_FLAG , 0) == 1 ? true : false; + mFMRadioEnabled = SystemProperties.getInt(GESTURE_FMRADIO_FLAG , 0) == 1 ? true : false; + + return mGestureEnabled && mFMRadioEnabled; + } + + private void stopPsensor() { + mSensorManager.unregisterListener(this); + if (myHandler != null) { + myHandler.removeCallbacks(myRunnable); + } + } + + private void resumePsensor() { + mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); + + myHandler = new Handler(); + myHandler.post(myRunnable); + } + + public static boolean isFmRadioGestureSupport() { + boolean enable = FeatureOption.VANZO_FEATURE_FM_RADIO_GESTURE; + android.util.Log.i(TAG, "isFmRadioGestureSupport enable = " + enable); + return enable; + } +// End of Vanzo:libing + /** + * Go to channel list activity + */ + private void enterChannelList() { + Log.d(TAG, "enterChannelList"); + if (mService != null) { + // AMS change the design for background start + // activity. need check app is background in app code + if (mIsActivityForeground) { + Intent intent = new Intent(); + intent.setClass(FmRadioActivity.this, FmRadioFavorite.class); + startActivityForResult(intent, REQUEST_CODE_FAVORITE); + } else { + Log.d(TAG, "enterChannelList. activity is background, not enter channel list."); + } + } + } + + /** + * Refresh the favorite button with the given station, if the station is + * favorite station, show favorite icon, else show non-favorite icon. + * + * @param station The station frequency + */ + private void refreshStationUI(int station) { + // Change the station frequency displayed. + mTextStationValue.setText(FmRadioUtils.formatStation(station)); + // Show or hide the favorite icon + if (FmRadioStation.isFavoriteStation(mContext, station)) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName(mContext, + station, FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + } + } + + @SuppressWarnings("deprecation") + private void restoreConfiguration() { + // after configuration change, need to reduction else the UI is abnormal + if (null != getLastNonConfigurationInstance()) { + Log.d(TAG, + "Configration changes,activity restart,need to reset UI!"); + Bundle bundle = (Bundle) getLastNonConfigurationInstance(); + if (null == bundle) { + return; + } + mPrevRecorderState = bundle.getInt("mPrevRecorderState"); + mRecordState = bundle.getInt("mRecordState"); + mIsNeedShowRecordDlg = bundle.getBoolean("mIsFreshRecordingStatus"); + // mIsNeedShowNoAntennaDlg = bundle.getBoolean("mIsNeedShowNoAntennaDlg"); + mIsNeedShowSearchDlg = bundle.getBoolean("mIsNeedShowSearchDlg"); + // we doesn't get it from service because the service may be + // null because not bind + mIsInRecordingMode = bundle.getBoolean("isInRecordingMode"); + mIsPlaying = bundle.getBoolean("mIsPlaying"); + Log.d(TAG, "bundle = " + bundle); + } + } + + /** + * Start and bind service, reduction variable values if configuration + * changed + */ + @Override + public void onStart() { + super.onStart(); + FmRadioService.setActivityIsOnStop(false); + Log.d(TAG, "FmRadioActivity.onStart start"); + // Should start FM service first. + if (null == startService(new Intent(FmRadioActivity.this, + FmRadioService.class))) { + Log.e(TAG, "Error: Cannot start FM service"); + return; + } + + mIsServiceStarted = true; + mIsServiceBinded = bindService(new Intent(FmRadioActivity.this, + FmRadioService.class), mServiceConnection, + Context.BIND_AUTO_CREATE); + + if (!mIsServiceBinded) { + Log.e(TAG, "Error: Cannot bind FM service"); + finish(); + return; + } + restoreConfiguration(); + Log.d(TAG, "FmRadioActivity.onStart end"); + } + + /** + * Refresh UI, when stop search, dismiss search dialog, pop up recording + * dialog if FM stopped when recording in background + */ + @Override + public void onResume() { + super.onResume(); +/* Vanzo:libing on: Thu, 15 May 2014 18:17:38 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onResume isGestureOpen = " + isGestureOpen()); + if (isFmRadioGestureSupport() && isGestureOpen()) { + resumePsensor(); + } +// End of Vanzo:libing + Log.d(TAG, "FmRadioActivity.onResume start"); + mIsActivityForeground = true; + if (null == mService) { + Log.d(TAG, "service has not bind finished"); + mIsNeedShowNoAntennaDlg = false; + return; + } + updateMenuStatus(); + updateDialogStatus(); + if (!isRecordFileExist()) { + mButtonPlayback.setEnabled(false); + } + checkNoAntennaDialogInOnResume(); + Log.d(TAG, "FmRadioActivity.onResume end"); + } + + /** + * In call and plug out earphone(in onPause state), need to show no antenna dialog but + * use mIsNeedShowNoAntennaDlg to save the state, because there is no where to show this dialog after onResume() for this case + */ + private void checkNoAntennaDialogInOnResume() { + if (mIsNeedShowNoAntennaDlg && mService != null && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + } + + /** + * When activity is paused call this method, indicate activity enter + * background if press exit, power down FM + */ + @Override + public void onPause() { + Log.d(TAG, "start FmRadioActivity.onPause"); + mIsActivityForeground = false; + /** + * Should dismiss before call onSaveInstance, or it will resume + * automatic + */ + mIsNeedShowSearchDlg = true; + dismissSearchDialog(); + + /** + * should dismiss before call onSaveInstance, or it will resume + * automatic. + */ + FmRecordDialogFragment df = (FmRecordDialogFragment) mFragmentManager + .findFragmentByTag(TAG_SAVE_RECORDINGD); + if (null != df && df.getShowsDialog()) { + Log.d(TAG, "onPause.dismissSaveRecordingDialog()"); + if (mService != null) { + mService.setModifiedRecordingName(df.getRecordingNameToSave()); + } + dismissSaveRecordingDialog(); + mIsNeedShowRecordDlg = true; + } + + // Need to dismiss avoid AMS popup this dialog again for power up will show this dialog + if (dismissNoAntennaDialog()) { + mIsNeedShowNoAntennaDlg = true; + } + + Log.d(TAG, "end FmRadioActivity.onPause"); + super.onPause(); + } + + /** + * Called when activity enter stopped state, unbind service, if exit + * pressed, stop service + */ + @Override + public void onStop() { + FmRadioService.setActivityIsOnStop(true); + Log.d(TAG, "start FmRadioActivity.onStop"); + if (mIsServiceBinded) { + unbindService(mServiceConnection); + mIsServiceBinded = false; + } + mIsNeedShowNoAntennaDlg = false; + Log.d(TAG, "end FmRadioActivity.onStop"); + super.onStop(); +/* Vanzo:libing on: Thu, 15 May 2014 18:15:55 +0800 + * add for gesture + */ + Log.d(TAG, "FMRadio onStop stopPsensor()"); + if (isFmRadioGestureSupport()) { + stopPsensor(); + } +// End of Vanzo:libing + } + + /** + * W activity destroy, unregister broadcast receiver and remove handler + * message + */ + @Override + public void onDestroy() { + Log.d(TAG, "start FmRadioActivity.onDestroy"); + unregisterSdcardReceiver(); + // need to call this function because if doesn't do this,after + // configuration change will have many instance and recording time + // or playing time will not refresh + // Remove all the handle message + mHandler.removeCallbacksAndMessages(null); + if (mService != null) { + mService.unregisterFmRadioListener(mFmRadioListener); + } + mFmRadioListener = null; + if (null != mPopupMenu) { + mPopupMenu.dismiss(); + mPopupMenu = null; + } + Log.d(TAG, "end FmRadioActivity.onDestroy"); + super.onDestroy(); + } + + /** + * Create options menu + * + * @param menu The option menu + * + * @return true or false indicate need to handle other menu item + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + Log.d(TAG, "start FmRadioActivity.onCreateOptionsMenu"); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.fm_action_bar, menu); + mMenuItemChannelList = menu.findItem(R.id.fm_channel_list); + mMenuItemOverflow = menu.findItem(R.id.fm_menu); + mMenuItemPower = menu.findItem(R.id.fm_power); + Log.d(TAG, "end FmRadioActivity.onCreateOptionsMenu"); + return true; + } + + /** + * Prepare options menu + * + * @param menu The option menu + * + * @return true or false indicate need to handle other menu item + */ + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + Log.d(TAG, "start FmRadioActivity.onPrepareOptionsMenu"); + mMenuItemChannelList.setVisible(!mIsInRecordingMode); + mMenuItemOverflow.setVisible(!mIsInRecordingMode); + mMenuItemPower.setVisible(!mIsInRecordingMode); + if (null == mService) { + Log.d(TAG, "mService is null"); + return !mIsInRecordingMode; + } + + boolean isPlaying = mService.isPowerUp(); + boolean isMakePowerdown = mService.isMakePowerDown(); + boolean isSeeking = mService.isSeeking(); + boolean isScan = mService.isScanning(); + // if fm power down by other app, should enable power menu, make it to + // powerup. + refreshActionMenuItem((isSeeking || isScan) ? false : isPlaying); + refreshActionMenuPower((isScan || isSeeking) + ? false + : (isPlaying || (isMakePowerdown && !mIsNeedDisablePower))); + + // check whether show animation + if (isSeeking) { + Log.d(TAG, "onPrepareOptionsMenu: it is seeking"); + startAnimation(); + } + + Log.d(TAG, "end FmRadioActivity.onPrepareOptionsMenu"); + return !mIsInRecordingMode; + } + + /** + * Handle event when option item selected + * + * @param item The clicked item + * + * @return true or false indicate need to handle other menu item or not + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Log.d(TAG, "start FmRadioActivity.onOptionsItemSelected"); + switch (item.getItemId()) { + case android.R.id.home: + onBackPressed(); + break; + + case R.id.fm_channel_list: + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + // Show favorite activity. + enterChannelList(); + break; + + case R.id.fm_power: + Log.d(TAG, "click fm_power menu"); + if (mIsPlaying) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + exitService(); + break; + } + powerUpFm(); + break; + + case R.id.fm_menu: + item.setEnabled(false); + + mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu)); + Menu menu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu); + mPopupMenu.setOnMenuItemClickListener(this); + mPopupMenu.setOnDismissListener(this); + + boolean isPlaying = mService.isPowerUp(); + if (isPlaying) { + menu.findItem(R.id.fm_record).setEnabled(true); + menu.findItem(R.id.fm_sound_mode).setEnabled(!mService.isBtConnected()); + menu.findItem(R.id.fm_sound_mode).setTitle( + mService.isSpeakerUsed() ? R.string.optmenu_earphone + : R.string.optmenu_speaker); + menu.findItem(R.id.fm_search).setEnabled(true); + } + refreshSoundModeVisiable(); + mPopupMenu.show(); + break; + + default: + Log.e(TAG, "Error: Invalid options menu item."); + break; + } + Log.d(TAG, "end FmRadioActivity.onOptionsItemSelected"); + return super.onOptionsItemSelected(item); + } + + /** + * Check whether antenna is available + * + * @return true or false indicate antenna available or not + */ + private boolean isAntennaAvailable() { + return mAudioManager.isWiredHeadsetOn(); + } + + /** + * When on activity result, tune to station which is from channel list + * + * @param requestCode The request code + * @param resultCode The result code + * @param data The intent from channel list + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (RESULT_OK == resultCode) { + if (REQUEST_CODE_FAVORITE != requestCode) { + Log.e(TAG, "Error: Invalid requestcode."); + return; + } + int iStation = data.getIntExtra( + FmRadioFavorite.ACTIVITY_RESULT, mCurrentStation); + // Tune to this station. + mCurrentStation = iStation; + // if tune from channel list, we should disable power menu, + // especially for + // power down state + mIsNeedDisablePower = true; + Log.d(TAG, "onActivityForReult:" + mIsNeedDisablePower); + if (null == mService) { + Log.d(TAG, "activity.onActivityResult mService is null"); + mNeedTuneto = true; + return; + } + tuneToStation(iStation); + return; + } + + if (FmRadioStation.isFavoriteStation(mContext, mCurrentStation)) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName( + mContext, mCurrentStation, + FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + mTextStationName.setText(""); + } + + // Do not handle other result. + Log.v(TAG, "The activity for requestcode " + requestCode + + " does not return any data."); + } + + /** + * Start animation + */ + private void startAnimation() { + mAnimImage.setAnimation(mAnimation); + mAnimImage.setVisibility(View.VISIBLE); + Log.d(TAG, "FmRadioActivity.startAnimation end"); + } + + /** + * Stop animation + */ + private void stopAnimation() { + mAnimImage.setVisibility(View.INVISIBLE); + mAnimImage.setAnimation(null); + } + + /** + * Restore recorder state from shared preference + */ + private void restoreRecorderState() { + // here should do some recorder related. + mIsInRecordingMode = mService.getRecordingMode(); + mRecordState = mService.getRecorderState(); + RelativeLayout recInfoBar = (RelativeLayout) findViewById(R.id.rl_recinfo); + // if recording or play backing state, should send message trigger + // refresh. + if ((FmRecorder.STATE_RECORDING == mRecordState) + || (FmRecorder.STATE_PLAYBACK == mRecordState)) { + SharedPreferences sharedPreferences = getSharedPreferences(REFS_NAME, 0); + mRecordStartTime = sharedPreferences.getLong(START_RECORD_TIME, 0); + mPlayStartTime = sharedPreferences.getLong(START_PLAY_TIME, 0); + recInfoBar.setVisibility(View.VISIBLE); + Log.d(TAG, "&&&sendemptyMessage:mRecoderStart:" + mRecordStartTime); + mHandler.sendEmptyMessage(FmRadioListener.MSGID_REFRESH); + } else { + recInfoBar.setVisibility(View.GONE); + } + // if remove from app list, it will make recorder ui confused. + switchRecordLayout(mIsInRecordingMode); + changeRecordingMode(mIsInRecordingMode); + if (mIsInRecordingMode) { + refreshRecordingStatus(FmRecorder.STATE_INVALID); + } + } + + /** + * Power up FM + */ + private void powerUpFm() { + Log.v(TAG, "start powerUpFm"); + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + startAnimation(); + mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + Log.v(TAG, "end powerUpFm"); + } + + private void setSpeakerPhoneOn(boolean isSpeaker) { + if (isSpeaker) { + Log.v(TAG, "UseSpeaker"); + mService.setSpeakerPhoneOn(true); + } else { + Log.v(TAG, "UseEarphone"); + mService.setSpeakerPhoneOn(false); + } + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_sound_mode).setTitle(mService.isSpeakerUsed() ? + R.string.optmenu_earphone : R.string.optmenu_speaker); + } + } + + /** + * Tune to a station + * + * @param station The tune station + */ + private void tuneToStation(final int station) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + mService.tuneStationAsync(FmRadioUtils.computeFrequency(station)); + if (!mIsPlaying) { + startAnimation(); + } + } + + /** + * Seek station according current frequency and direction + * + * @param station The seek start station + * @param direction The seek direction + */ + private void seekStation(final int station, boolean direction) { + // If the seek AsyncTask has been executed and not canceled, cancel it + // before start new. + startAnimation(); + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + mService.seekStationAsync(FmRadioUtils.computeFrequency(station), + direction); + } + + private void refreshImageButton(boolean enabled) { + mButtonDecrease.setEnabled(enabled); + mButtonPrevStation.setEnabled(enabled); + mButtonNextStation.setEnabled(enabled); + mButtonIncrease.setEnabled(enabled); + } + + // Refresh action menu except power menu + private void refreshActionMenuItem(boolean enabled) { + // action menu + if (null != mMenuItemChannelList) { + // if power down by other app, should disable channelist list, over + // menu + mMenuItemChannelList.setEnabled(enabled); + mMenuItemOverflow.setEnabled(enabled); + } + } + + // Refresh action menu only power menu + private void refreshActionMenuPower(boolean enabled) { + Log.d(TAG, "refreshActionMenuPower enabled:" + enabled + ", mIsPlaying:" + mIsPlaying); + // action menu + if (null != mMenuItemChannelList) { + // if fm power down by other app, should enable this button to + // powerup. + mMenuItemPower.setEnabled(enabled); + mMenuItemPower.setIcon(mIsPlaying ? R.drawable.btn_fm_powerup_selector + : R.drawable.btn_fm_powerdown_selector); + } + } + + private void refreshPopupMenuItem(boolean enabled) { + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + menu.findItem(R.id.fm_record).setEnabled(enabled); + menu.findItem(R.id.fm_search).setEnabled(enabled); + menu.findItem(R.id.fm_sound_mode).setEnabled(enabled && !mService.isBtConnected()); + refreshSoundModeVisiable(); + } + } + + private void refreshSoundModeVisiable() { + if (null != mPopupMenu) { + Menu menu = mPopupMenu.getMenu(); + // Need hide only short antenna support and not plug in earphone + boolean hideSoundMode = SHORT_ANNTENNA_SUPPORT && !mService.isAntennaAvailable(); + boolean showSoundMode = !hideSoundMode; + menu.findItem(R.id.fm_sound_mode).setVisible(showSoundMode); + } + } + + private void refreshRecordNotIdle() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(false); + } + + private void refreshRecordIdle() { + mButtonRecord.setEnabled(true); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(false); + } + + private void refreshPlaybackIdle(boolean btnPlayBack) { + mButtonRecord.setEnabled(true); + mButtonPlayback.setEnabled(btnPlayBack); + mButtonStop.setEnabled(false); + } + + private void refreshRecording() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(true); + } + + private void refreshPlaybacking() { + mButtonRecord.setEnabled(false); + mButtonPlayback.setEnabled(false); + mButtonStop.setEnabled(true); + } + + /** + * Called when back pressed + */ + @Override + public void onBackPressed() { + Log.d(TAG, "begin FmRadioActivity.onBackPressed"); + + if (mIsInRecordingMode) { + changeRecordingMode(false); + if (null == mService) { + Log.d(TAG, "mService is null"); + return; + } + // no need consider power down and other situation + boolean isPlaying = mService.isPowerUp(); + refreshImageButton(isPlaying); + refreshPopupMenuItem(isPlaying); + refreshActionMenuItem(isPlaying); + refreshActionMenuPower(true); + if (mService != null && !mService.isAntennaAvailable() + && !FmRadioUtils.isFmShortAntennaSupport()) { + Log.w(TAG, "Need to show no antenna dialog for plug out earphone in onPause state"); + dismissNoAntennaDialog(); + showNoAntennaDialog(); + } + return; + } + + // exit fm, disable all button + if (!mIsPlaying && (null != mService) && !mService.isPowerUping()) { + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + exitService(); + return; + } + + super.onBackPressed(); + Log.d(TAG, "end FmRadioActivity.onBackPressed"); + } + + private void showToast(CharSequence text) { + if (null == mToast) { + mToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT); + } + mToast.setText(text); + mToast.show(); + Log.v(TAG, "FmRadioActivity.showToast: toast = " + text); + } + + private void showRds(String text) { + mTextRds.setText(text); + mTextRds.setSelected(true); + Log.v(TAG, "FmRadioActivity.showRds: RDS = " + text); + } + + /** + * Change recording mode + * + * @param recordingMode The current recording mode + */ + private void changeRecordingMode(boolean recordingMode) { + Log.d(TAG, "changeRecordingMode: " + recordingMode); + if (mIsInRecordingMode == recordingMode) { + Log.e(TAG, "FM already " + (recordingMode ? "in" : "NOT in") + + "recording mode!"); + return; + } + mIsInRecordingMode = recordingMode; + mService.setRecordingModeAsync(recordingMode); + switchRecordLayout(recordingMode); + } + + /** + * Switch to record layout, if in recorder mode. + * + * @param recordingMode true in recorder mode, false not in recorder mode + */ + private void switchRecordLayout(boolean recordingMode) { + ActionBar actionBar = getActionBar(); + invalidateOptionsMenu(); + + // Set the action bar on the right to be up navigation + actionBar.setDisplayHomeAsUpEnabled(recordingMode); + actionBar.setHomeButtonEnabled(recordingMode); + actionBar.setTitle(recordingMode ? R.string.fm_recorder_name + : R.string.app_name); + + LinearLayout recBar = (LinearLayout) findViewById(R.id.bottom_bar_recorder); + LinearLayout bottomBar = (LinearLayout) findViewById(R.id.bottom_bar); + + bottomBar.setVisibility(recordingMode ? View.GONE : View.VISIBLE); + recBar.setVisibility(recordingMode ? View.VISIBLE : View.GONE); + mButtonAddToFavorite.setVisibility(recordingMode ? View.GONE + : View.VISIBLE); + } + + /** + * Update recording UI according record state + * + * @param stateOverride The recording state + */ + private void refreshRecordingStatus(int stateOverride) { + int recorderState = FmRecorder.STATE_INVALID; + + recorderState = (stateOverride == FmRecorder.STATE_INVALID ? mService + .getRecorderState() : stateOverride); + + Log.d(TAG, "refreshRecordingStatus: state=" + recorderState); + switch (recorderState) { + case FmRecorder.STATE_IDLE: + long recordTime = mService.getRecordTime(); + if (recordTime > 0) { + if (isRecordFileExist()) { + mButtonPlayback.setEnabled(true); + } + + if (FmRecorder.STATE_RECORDING == mPrevRecorderState) { + Log.d(TAG, "need show recorder dialog.mPrevRecorderState:" + + mPrevRecorderState); + if (mIsActivityForeground) { + showSaveRecordingDialog(); + } else { + mIsNeedShowRecordDlg = true; + } + } + } else { + mButtonPlayback.setEnabled(false); + } + + refreshPlaybackIdle((recordTime > 0) && isRecordFileExist()); + mRLRecordInfo.setVisibility(View.GONE); + break; + + case FmRecorder.STATE_RECORDING: + mTxtRecInfoLeft.setText(""); + mTxtRecInfoRight.setText(""); + mTxtRecInfoLeft.setSelected(false); + refreshRecording(); + mRLRecordInfo.setVisibility(View.VISIBLE); + break; + + case FmRecorder.STATE_PLAYBACK: + String recordingName = mService.getRecordingName(); + if (null == recordingName) { + recordingName = ""; + } + mTxtRecInfoLeft.setText(recordingName); + mTxtRecInfoRight.setText(""); + mTxtRecInfoLeft.setSelected(true); + refreshPlaybacking(); + mRLRecordInfo.setVisibility(View.VISIBLE); + break; + + case FmRecorder.STATE_INVALID: + refreshRecordIdle(); + mRLRecordInfo.setVisibility(View.GONE); + break; + + default: + Log.d(TAG, "invalid record status"); + break; + } + mPrevRecorderState = recorderState; + Log.d(TAG, "refreshRecordingStatus.mPrevRecorderState:" + mPrevRecorderState); + } + + /** + * Check whether FM recording temporary file exist + * + * @return true if FM recording temporary file exist, false not exist FM + * recording temporary file + */ + private boolean isRecordFileExist() { + String fileName = null; + fileName = mService.getRecordingNameWithPath(); + // if recording file is delete by user, play button disabled + File recordingFileToSave = new File(fileName + FmRecorder.RECORDING_FILE_EXTENSION); + return recordingFileToSave.exists(); + } + + /** + * use onRetainNonConfigurationInstance because after configuration change, + * activity will destroy and create need use this function to save some + * important variables + */ + @Override + public Object onRetainNonConfigurationInstance() { + final int size = 5; + Bundle bundle = new Bundle(size); + bundle.putBoolean("isInRecordingMode", mIsInRecordingMode); + bundle.putInt("mPrevRecorderState", mPrevRecorderState); + bundle.putBoolean("mIsFreshRecordingStatus", mIsNeedShowRecordDlg); + //bundle.putBoolean("mIsNeedShowNoAntennaDlg", mIsNeedShowNoAntennaDlg); + bundle.putBoolean("mIsNeedShowSearchDlg", mIsNeedShowSearchDlg); + bundle.putInt("mRecordState", mRecordState); + bundle.putBoolean("mIsPlaying", mIsPlaying); + Log.d(TAG, "onRetainNonConfigurationInstance() bundle:" + bundle); + return bundle; + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + Log.d(TAG, "onSaveInstanceState"); + super.onSaveInstanceState(outState); + } + + /** + * Handle event about pop up menu clicked + * + * @param item The pop up menu item + * + * @return true or false indicate need to handle other menu item or not + */ + @Override + public boolean onMenuItemClick(MenuItem item) { + Log.d(TAG, "onMenuItemClick:" + item.getItemId()); + switch (item.getItemId()) { + case R.id.fm_search: + // Don't show search dialog when activity is background + if (!mIsActivityForeground) { + Log.w(TAG, "click searh menu in background, don't show search dialog"); + return false; + } + mIsNeedShowSearchDlg = true; + refreshImageButton(false); + refreshActionMenuItem(false); + refreshPopupMenuItem(false); + refreshActionMenuPower(false); + showSearchDialog(); + FmRadioStation.cleanSearchedStations(mContext); + mService.startScanAsync(); + break; + + case R.id.fm_sound_mode: + setSpeakerPhoneOn(!mService.isSpeakerUsed()); + break; + + case R.id.fm_record: + changeRecordingMode(true); + refreshRecordingStatus(FmRecorder.STATE_INVALID); + break; + + default: + Log.d(TAG, "invalid menu item"); + break; + } + return false; + } + + /** + * Called when PopUp menu dismissed + * + * @param PopUp The menu which dismiss + */ + @Override + public void onDismiss(PopupMenu menu) { + Log.d(TAG, "popmenu dismiss listener:" + menu); + invalidateOptionsMenu(); + } + + /** + * Exit FM service + */ + private void exitService() { + Log.i(TAG, "exitService"); + if (mIsServiceBinded) { + unbindService(mServiceConnection); + mIsServiceBinded = false; + } + + if (mIsServiceStarted) { + boolean isSuccess = stopService(new Intent( + FmRadioActivity.this, FmRadioService.class)); + if (!isSuccess) { + Log.e(TAG, "Error: Cannot stop the FM service."); + } + mIsServiceStarted = false; + } + } + + /** + * Show no antenna dialog + */ + public void showNoAntennaDialog() { + NoAntennaDialog newFragment = NoAntennaDialog.newInstance(); + newFragment.show(mFragmentManager, TAG_NO_ANTENNA); + mFragmentManager.executePendingTransactions(); + } + + /** + * Show save recording dialog + * + * @param name The recording file name + */ + public void showSaveRecordingDialog() { + String sdcard = FmRadioService.getRecordingSdcard(); + String defaultName = mService.getRecordingName(); + String recordingName = mService.getModifiedRecordingName(); + FmRecordDialogFragment newFragment = + new FmRecordDialogFragment(sdcard, defaultName, recordingName); + newFragment.show(mFragmentManager, TAG_SAVE_RECORDINGD); + mFragmentManager.executePendingTransactions(); + } + + /** + * Show search dialog + */ + private void showSearchDialog() { + SearchChannelsDialog newFragment = SearchChannelsDialog.newInstance(); + newFragment.show(mFragmentManager, TAG_SEARCH); + mFragmentManager.executePendingTransactions(); + } + + /** + * Dismiss search dialog + */ + private void dismissSearchDialog() { + SearchChannelsDialog newFragment = (SearchChannelsDialog) mFragmentManager + .findFragmentByTag(TAG_SEARCH); + if (null != newFragment) { + newFragment.dismissAllowingStateLoss(); + } + } + + /** + * Dismiss save recording dialog + */ + private void dismissSaveRecordingDialog() { + FragmentTransaction ft = mFragmentManager.beginTransaction(); + Fragment fragment = mFragmentManager.findFragmentByTag(TAG_SAVE_RECORDINGD); + if (null != fragment) { + ft.remove(fragment); + ft.commitAllowingStateLoss(); + } + } + + /** + * Check whether recording card is unmounted + * + * @param intent The intent about sdcard + * + * @return true or false indicate recording card unmount or not + */ + private boolean isRecordingCardUnmount(Intent intent) { + String sdcard = FmRadioService.getRecordingSdcard(); + String unmountSDCard = intent.getData().toString(); + Log.d(TAG, "unmount sd card file path: " + unmountSDCard); + return unmountSDCard.equalsIgnoreCase("file://" + sdcard) ? true + : false; + } + + /** + * Dismiss no antenna dialog + */ + private boolean dismissNoAntennaDialog() { + NoAntennaDialog newFragment = (NoAntennaDialog) mFragmentManager + .findFragmentByTag(TAG_NO_ANTENNA); + if (null != newFragment) { + newFragment.dismissAllowingStateLoss(); + return true; + } + return false; + } + + /** + * Cancel search progress + */ + public void cancelSearch() { + Log.d(TAG, "FmRadioActivity.cancelSearch"); + mService.stopScan(); + } + + /** + * No antenna continue to operate + */ + @Override + public void noAntennaContinue() { + // We let user use the app if no antenna. + // But we do not automatically start FM. + Log.d(TAG, " noAntennaContinue.onClick ok to continue"); + if (isAntennaAvailable()) { + powerUpFm(); + } else { + Log.d(TAG, "noAntennaContinue.earphone is not ready"); + mService.switchAntennaAsync(1); + } + } + + /** + * No antenna cancel to operate + */ + @Override + public void noAntennaCancel() { + Log.d(TAG, " onClick Negative"); + if (mService != null && !mService.isInLockTaskMode()) { + exitService(); + } else { + Log.d(TAG, "No need exit Service and Activity cause current is lock mode"); + } + } + + /** + * Recording dialog click + * + * @param recordingName The new recording name + */ + @Override + public void onRecordingDialogClick(String recordingName) { + mService.saveRecordingAsync(recordingName); + mService.setModifiedRecordingName(null); + } + + /** + * Update rds information + */ + private void updateRds() { + if (mIsPlaying) { + Bundle bundle = new Bundle(2); + bundle.putString(FmRadioListener.KEY_PS_INFO, mService.getPS()); + bundle.putString(FmRadioListener.KEY_RT_INFO, mService.getLRText()); + Message msg = mHandler + .obtainMessage(FmRadioListener.LISTEN_PS_CHANGED); + msg.setData(bundle); + mHandler.sendMessage(msg); + } + } + + /** + * Update current station according service station + */ + private void updateCurrentStation() { + // get the frequency from service, set frequency in activity, UI, + // database + // same as the frequency in service + int freq = mService.getFrequency(); + if (FmRadioUtils.isValidStation(freq)) { + if (mCurrentStation != freq) { + Log.d(TAG, "frequency in service isn't same as in database"); + mCurrentStation = freq; + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + refreshStationUI(mCurrentStation); + } + } + } + + /** + * Update button status, and dialog status + */ + private void updateDialogStatus() { + Log.d(TAG, "updateDialogStatus.mIsNeedShowSearchDlg:" + mIsNeedShowSearchDlg); + boolean isScan = mService.isScanning(); + // check whether show search dialog, because it may be dismissed + // onSaveInstance + if (isScan && mIsNeedShowSearchDlg) { + Log.d(TAG, "updateDialogStatus: show search dialog. isScan is " + isScan); + mIsNeedShowSearchDlg = false; + showSearchDialog(); + } + + // check whether show recorder dialog, when activity is foreground + if (mIsNeedShowRecordDlg) { + Log.d(TAG, "updateDialogStatus.resume recordDlg.mPrevRecorderState:" + + mPrevRecorderState); + showSaveRecordingDialog(); + mIsNeedShowRecordDlg = false; + } + + /* + // check whether show no antenna dialog, when activity is foreground + if (mIsNeedShowNoAntennaDlg) { + Log.d(TAG, "updateDialogStatus.resume noAntennaDlg:"); + showNoAntennaDialog(); + refreshActionMenuPower(true); + mIsNeedShowNoAntennaDlg = false; + } + */ + } + + /** + * Update menu status, and animation + */ + private void updateMenuStatus() { + boolean isPlaying = mService.isPowerUp(); + boolean isPoweruping = mService.isPowerUping(); + boolean isSeeking = mService.isSeeking(); + boolean isScan = mService.isScanning(); + boolean isMakePowerdown = mService.isMakePowerDown(); + Log.d(TAG, "updateMenuStatus.isSeeking:" + isSeeking); + boolean fmStatus = (isScan || isSeeking || isPoweruping); + // when seeking, all button should disabled, + // else should update as origin status + refreshImageButton(fmStatus ? false : isPlaying); + refreshPopupMenuItem(fmStatus ? false : isPlaying); + refreshActionMenuItem(fmStatus ? false : isPlaying); + // if fm power down by other app, should enable power button + // to powerup. + Log.d(TAG, "updateMenuStatus.mIsNeedDisablePower: " + mIsNeedDisablePower); + refreshActionMenuPower(fmStatus ? false : + (isPlaying || (isMakePowerdown && !mIsNeedDisablePower))); + + // check whether show animation + if (isSeeking || isPoweruping) { + Log.d(TAG, "updateMenuStatus. it is seeking or poweruping"); + startAnimation(); + } + } + + private void initUiComponent() { + Log.i(TAG, "initUIComponent"); + mTextRds = (TextView) findViewById(R.id.text_rds); + mTextRds.setText(""); + mTextFm = (TextView) findViewById(R.id.text_fm); + mTextFm.setText(FM); + mTextMHz = (TextView) findViewById(R.id.text_mhz); + mTextMHz.setText(R.string.fm_unit); + + mTextStationValue = (TextView) findViewById(R.id.station_value); + mTxtRecInfoLeft = (TextView) findViewById(R.id.txtRecInfoLeft); + mTxtRecInfoRight = (TextView) findViewById(R.id.txtRecInfoRight); + mRLRecordInfo = (RelativeLayout) findViewById(R.id.rl_recinfo); + mButtonRecord = (ImageButton) findViewById(R.id.btn_record); + mButtonStop = (ImageButton) findViewById(R.id.btn_stop); + mButtonPlayback = (ImageButton) findViewById(R.id.btn_playback); + mButtonAddToFavorite = (ImageButton) findViewById(R.id.button_add_to_favorite); + mTextStationName = (TextView) findViewById(R.id.station_name); + mButtonDecrease = (ImageButton) findViewById(R.id.button_decrease); + mButtonIncrease = (ImageButton) findViewById(R.id.button_increase); + mButtonPrevStation = (ImageButton) findViewById(R.id.button_prevstation); + mButtonNextStation = (ImageButton) findViewById(R.id.button_nextstation); + + // initial mPopupMenu + mPopupMenu = new PopupMenu(mContext, findViewById(R.id.fm_menu)); + Menu menu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(R.menu.fm_menu, menu); + + // put favorite button here since it might be used very early in + // changing recording mode + mCurrentStation = FmRadioStation.getCurrentStation(mContext); + boolean isFavoriteStation = FmRadioStation.isFavoriteStation(mContext, + mCurrentStation); + // If the current station is in favorite, set its icon to favorite icon; + // else, set to none favorite icon. + if (isFavoriteStation) { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_on_selector); + mTextStationName.setText(FmRadioStation.getStationName(mContext, + mCurrentStation, FmRadioStation.STATION_TYPE_FAVORITE)); + } else { + mButtonAddToFavorite + .setImageResource(R.drawable.btn_fm_favorite_off_selector); + } + + mTextStationValue.setText(FmRadioUtils.formatStation(mCurrentStation)); + mAnimation = (Animation) AnimationUtils.loadAnimation(this, + R.drawable.anim); + mAnimImage = (ImageView) findViewById(R.id.iv_anim); + mAnimImage.setVisibility(View.INVISIBLE); + } + + private void registerButtonClickListener() { + mButtonRecord.setOnClickListener(mButtonClickListener); + mButtonStop.setOnClickListener(mButtonClickListener); + mButtonPlayback.setOnClickListener(mButtonClickListener); + mButtonAddToFavorite.setOnClickListener(mButtonClickListener); + mButtonDecrease.setOnClickListener(mButtonClickListener); + mButtonIncrease.setOnClickListener(mButtonClickListener); + mButtonPrevStation.setOnClickListener(mButtonClickListener); + mButtonNextStation.setOnClickListener(mButtonClickListener); + } + + private void registerSdcardReceiver() { + IntentFilter iFilter = new IntentFilter(); + iFilter.addAction(Intent.ACTION_MEDIA_EJECT); + iFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); + iFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); + iFilter.addDataScheme("file"); + registerReceiver(mSdcardListener, iFilter); + } + + private void unregisterSdcardReceiver() { + unregisterReceiver(mSdcardListener); + } + + private void refreshTimeText() { + Log.d(TAG, "refreshTimeText:mRecordState:" + mRecordState); + if (!mIsInRecordingMode) { + Log.d(TAG, "refreshTimeText:mIsInRecordingMode:" + mIsInRecordingMode); + if (mRecordState == FmRecorder.STATE_RECORDING) { + mService.stopRecordingAsync(); + } else if (mRecordState == FmRecorder.STATE_PLAYBACK) { + mService.stopPlaybackAsync(); + } + return; + } + + final int oneSecond = 1000; + switch (mRecordState) { + case FmRecorder.STATE_RECORDING: + int recordTime = (int) ((SystemClock.elapsedRealtime() - mRecordStartTime) / + oneSecond); + mTxtRecInfoLeft.setText(getTimeString(recordTime)); + Log.d(TAG, "Recording time = " + mTxtRecInfoLeft.getText()); + String recordingSdcard = FmRadioService.getRecordingSdcard(); + if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) { + // recordTime 1s to avoid start() then quickly stop() native exception + if (recordTime > 1) { + // Insufficient storage + mService.stopRecordingAsync(); + } + } + break; + + case FmRecorder.STATE_PLAYBACK: + int playTime = (int) ((SystemClock.elapsedRealtime() - mPlayStartTime) / oneSecond); + mTxtRecInfoRight.setText(getTimeString(playTime)); + Log.d(TAG, "Playing time = " + mTxtRecInfoRight.getText()); + break; + + default: + break; + } + mHandler.sendEmptyMessageDelayed(FmRadioListener.MSGID_REFRESH, oneSecond); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java new file mode 100755 index 0000000..5397e9b --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioContentProvider.java @@ -0,0 +1,297 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +/** + * This class provider interface to operator FM database table StationList + */ +public class FmRadioContentProvider extends ContentProvider { + private static final String TAG = "FmRx/Provider"; + + // database instance use to operate the database + private SQLiteDatabase mSqlDb = null; + // database helper use to get database instance + private DatabaseHelper mDbHelper = null; + // database name + private static final String DATABASE_NAME = "FmRadio.db"; + // database version + private static final int DATABASE_VERSION = 1; + // table name + private static final String TABLE_NAME = "StationList"; + + // URI match code + private static final int STATION_FREQ = 1; + // URI match code + private static final int STATION_FREQ_ID = 2; + // use to match URI + private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); + + // match URI with station frequency or station frequency id + static { + URI_MATCHER.addURI(FmRadioStation.AUTHORITY, FmRadioStation.STATION, STATION_FREQ); + URI_MATCHER.addURI(FmRadioStation.AUTHORITY, FmRadioStation.STATION + "/#", + STATION_FREQ_ID); + } + + /** + * Helper to operate database + */ + private static class DatabaseHelper extends SQLiteOpenHelper { + + /** + * initial database name and database version + * + * @param context application context + */ + DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + /** + * Create database table + * + * @param db The database + */ + @Override + public void onCreate(SQLiteDatabase db) { + // Create the table + Log.d(TAG, "DatabaseHelper.onCreate"); + db.execSQL( + "Create table " + + TABLE_NAME + + "(" + + FmRadioStation.Station._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + + FmRadioStation.Station.COLUMN_STATION_NAME + " TEXT," + + FmRadioStation.Station.COLUMN_STATION_FREQ + " INTEGER," + + FmRadioStation.Station.COLUMN_STATION_TYPE + " INTEGER" + + ");" + ); + } + + /** + * Upgrade database + * + * @param db database + * @param oldVersion The old database version + * @param newVersion The new database version + */ + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.i(TAG, "Upgrading database from version " + oldVersion + " to " + + newVersion + ", which will destroy all old data"); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(db); + } + } + + /** + * Delete database table rows with condition + * + * @param uri The uri to delete + * @param selection The where cause to apply, if null will delete all rows + * @param selectionArgs The select value + * + * @return The rows number has be deleted + */ + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + Log.d(TAG, "FmRadioContentProvider.delete"); + int rows = 0; + mSqlDb = mDbHelper.getWritableDatabase(); + switch (URI_MATCHER.match(uri)) { + case STATION_FREQ: + rows = mSqlDb.delete(TABLE_NAME, selection, selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + break; + + case STATION_FREQ_ID: + String stationID = uri.getPathSegments().get(1); + rows = mSqlDb.delete(TABLE_NAME, + FmRadioStation.Station._ID + + "=" + + stationID + + (TextUtils.isEmpty(selection) ? "" : " AND (" + selection + ")"), + selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + break; + + default: + Log.e(TAG, "Error: Unkown URI to delete: " + uri); + break; + } + return rows; + } + + /** + * Insert values to database with uri + * + * @param uri The insert uri + * @param values The insert values + * + * @return The uri after inserted + */ + @Override + public Uri insert(Uri uri, ContentValues values) { + Log.d(TAG, "FmRadioContentProvider.insert"); + Uri rowUri = null; + mSqlDb = mDbHelper.getWritableDatabase(); + ContentValues v = new ContentValues(values); + // Do not insert invalid values. + if (!v.containsKey(FmRadioStation.Station.COLUMN_STATION_NAME) + || !v.containsKey(FmRadioStation.Station.COLUMN_STATION_FREQ) + || !v.containsKey(FmRadioStation.Station.COLUMN_STATION_TYPE)) { + Log.e(TAG, "Error: Invalid values."); + return rowUri; + } + + long rowId = mSqlDb.insert(TABLE_NAME, null, v); + if (rowId <= 0) { + Log.e(TAG, "Error: Failed to insert row into " + uri); + } + rowUri = ContentUris.appendId(FmRadioStation.Station.CONTENT_URI.buildUpon(), rowId) + .build(); + getContext().getContentResolver().notifyChange(rowUri, null); + return rowUri; + } + + /** + * Create database helper + * + * @return true if create database helper success + */ + @Override + public boolean onCreate() { + mDbHelper = new DatabaseHelper(getContext()); + return (null == mDbHelper) ? false : true; + } + + /** + * Query the database with current settings and add information + * + * @param uri The database uri + * @param projection The columns need to query + * @param selection The where clause + * @param selectionArgs The where value + * @param sortOrder The column to sort + * + * @return The query result cursor + */ + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + SQLiteDatabase db = mDbHelper.getReadableDatabase(); + qb.setTables(TABLE_NAME); + + int match = URI_MATCHER.match(uri); + + if (STATION_FREQ_ID == match) { + qb.appendWhere("_id = " + uri.getPathSegments().get(1)); + } + + Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder); + if (null != c) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; + } + + /** + * Update the database content use content values with current settings and + * add information + * + * @param uri The database uri + * @param values The values need to update + * @param selection The where clause + * @param selectionArgs The where value + * + * @return The row numbers have changed + */ + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + Log.d(TAG, "FmRadioContentProvider.update"); + int rows = 0; + mSqlDb = mDbHelper.getWritableDatabase(); + switch (URI_MATCHER.match(uri)) { + case STATION_FREQ: + rows = mSqlDb.update(TABLE_NAME, values, selection, selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + break; + case STATION_FREQ_ID: + String stationID = uri.getPathSegments().get(1); + rows = mSqlDb.update(TABLE_NAME, + values, + FmRadioStation.Station._ID + + "=" + + stationID + + (TextUtils.isEmpty(selection) ? "" : " AND (" + selection + ")"), + selectionArgs); + getContext().getContentResolver().notifyChange(uri, null); + break; + default: + Log.e(TAG, "Error: Unkown URI to update: " + uri); + break; + } + return rows; + } + + /** + * Get uri type + * + * @param uri The the uri + * + * @return The type + */ + @Override + public String getType(Uri uri) { + return null; + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java new file mode 100755 index 0000000..51fd3dc --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioEmActivity.java @@ -0,0 +1,1049 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein + * is confidential and proprietary to MediaTek Inc. and/or its licensors. + * Without the prior written permission of MediaTek inc. and/or its licensors, + * any reproduction, modification, use or disclosure of MediaTek Software, + * and information contained herein, in whole or in part, shall be strictly prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON + * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. + * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE + * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR + * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH + * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES + * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES + * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK + * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND + * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, + * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, + * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO + * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek Software") + * have been modified by MediaTek Inc. All revisions are subject to any receiver's + * applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.Arrays; + +/** + * This class is used to provide engineer mode function for hardware test + * + */ +public class FmRadioEmActivity extends Activity { + public static final String TAG = "FmRx/EM"; + + private static final String TYPE_MSGID = "MSGID"; + private static final String RDS_BLER_STRING = "RDS_BLER_STRING"; + private static final String RDS_RSSI_STRING = "RDS_RSSI_STRING"; + private static final String RDS_STEREMONO_STRING = "RDS_STEREMONO_STRING"; + private static final String RDS_CAPARRAY_STRING = "RDS_CAPARRAY_STRING"; + + private static final int MSGID_OK = 1; + private static final int MSGID_UPDATE_RDS = 2; + private static final int MSGID_UPDATE_CURRENT_STATION = 3; + + private static final int MSGID_TICK_EVENT = 6; + private static final int MSGID_INIT_OK = 7; + private static final int MSGID_POWERUP = 8; + private static final int MSGID_TUNE_FNISHED = 9; + + private boolean mIsServiceStarted = false; + private boolean mIsServiceBinded = false; + private FmRadioService mService = null; + + private boolean mIsPlaying = false; // When start, the radio is not playing. + + // Record whether we are destroying. + private boolean mIsDestroying = false; + private boolean mIsTickEventExit = false; + + // Strings shown in RDS text view. + private String mPSString = ""; + private String mLRTextString = ""; + + private TextView mTextStereoMono = null; + private TextView mTextRssi = null; + private TextView mTextCapArray = null; + private TextView mTextRdsBler = null; + private TextView mTextRdsPS = null; + private TextView mTextRdsRT = null; + private TextView mTextChipID = null; + private TextView mTextECOVersion = null; + private TextView mTextPatchVersion = null; + private TextView mTextDSPVersion = null; + private TextView mTextCMDReturn0 = null; + private TextView mTextCMDReturn1 = null; + private TextView mTextCMDReturn2 = null; + private TextView mTextCMDReturn3 = null; + private TextView mTextCMDReturn4 = null; + private EditText mEditFreq = null; + + private EditText mEditRssiThreshold = null; + private EditText mEditMuteGain = null; + private EditText mEditDesenseRssi = null; + private EditText mEditCMD0 = null; + private EditText mEditCMD1 = null; + private EditText mEditCMD2 = null; + private EditText mEditCMD3 = null; + private EditText mEditCMD4 = null; + private EditText mEditCMD5 = null; + private EditText mEditCMD6 = null; + private EditText mEditCMD7 = null; + private EditText mEditCMD8 = null; + private EditText mEditCMD9 = null; + private EditText mEditCMD10 = null; + private EditText mEditCMD11 = null; + private EditText mEditCMD12 = null; + private EditText mEditCMD13 = null; + private EditText mEditCMD14 = null; + private EditText mEditCMD15 = null; + private EditText mEditCMD16 = null; + private EditText mEditCMD17 = null; + private EditText mEditCMD18 = null; + private EditText mEditCMD19 = null; + private Button mButtonRssiThreshold = null; + private Button mButtonMuteGain = null; + private Button mButtonDesenseRssi = null; + private Button mButtonCMD = null; + private Button mButtonTune = null; + private RadioButton mRdAntennaS = null; + private RadioButton mRdAntennaL = null; + private RadioGroup mRgAntenna = null; + private RadioButton mRdStereo = null; + private RadioButton mRdMono = null; + private Context mContext = null; + private Thread mTickEventThread = null; + + // Can not use float to record the station. Because there will be inaccuracy when increase/decrease 0.1 + private int mCurrentStation = FmRadioUtils.DEFAULT_STATION; + private AudioManager mAudioManager = null; + private HeadsetConnectionReceiver mHeadsetConnectionReceiver = null; + + /** + * use to show update antenna UI + * + */ + private class HeadsetConnectionReceiver extends BroadcastReceiver { + public void onReceive(Context context, Intent intent) { + if (intent.getIntExtra("state", 0) == 0) { // unpluged + if (mIsPlaying) { + mRgAntenna.check(R.id.FMR_Antenna_short); + } + } else if (intent.getIntExtra("state", 0) == 1) { // pluged + if (mIsPlaying) { + mRgAntenna.check(R.id.FMR_Antenna_long); + } + } + + } + }; + + /** + * click listener + */ + private View.OnClickListener mButtonClickListener = new View.OnClickListener() { + /** + * handle click event + * @param v clicked view + */ + public void onClick(View v) { + switch (v.getId()) { + case R.id.FMR_Antenna_short: + switchAntenna(1); + break; + case R.id.FMR_Antenna_long: + switchAntenna(0); + break; + case R.id.FMR_Stereomono_stereo: +// if (!setStereoMono(false)) { +// Toast.makeText(mContext, "Set Stereo Mono failed.", Toast.LENGTH_SHORT).show(); +// } + setStereoMono(false); + break; + case R.id.FMR_Stereomono_mono: +// if (!setStereoMono(true)) { +// Toast.makeText(mContext, "Set Stereo Mono failed.", Toast.LENGTH_SHORT).show(); +// } + setStereoMono(true); + break; + case R.id.FMR_Freq_tune: + String s = mEditFreq.getText().toString(); + float freq = 0; + try { + freq = Float.valueOf(s); + + // If input not between 87.5 to 108.0 + int station = FmRadioUtils.computeStation(freq); + if (!FmRadioUtils.isValidStation(station)) { + Toast.makeText(FmRadioEmActivity.this, "Please input 87.5 ~ 108.0.", Toast.LENGTH_SHORT).show(); + mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation)); + return; + } + } catch (NumberFormatException e) { + Toast.makeText(FmRadioEmActivity.this, "bad float format.", Toast.LENGTH_SHORT).show(); + mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation)); + return; + } + + + // disable button before it finished tune. + mButtonTune.setEnabled(false); + tuneToStation(FmRadioUtils.computeStation(freq)); + break; + case R.id.FMR_EM_RSSI_THRESHOLD_OK: + String rssi = mEditRssiThreshold.getText().toString(); + int rssi_edit = 0; + try { + rssi_edit = Integer.valueOf(rssi); + } catch (NumberFormatException e) { + Log.e(TAG, "click rssi threshold button:" + e); + Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show(); + mEditFreq.setText("0"); + return; + } + mButtonRssiThreshold.setEnabled(false); + boolean isRssiOk = mService.setEmth(0, rssi_edit); + mButtonRssiThreshold.setEnabled(true); + if (isRssiOk) { + Toast.makeText(FmRadioEmActivity.this, "Rssi Threshold set OK.", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(FmRadioEmActivity.this, "Rssi Threshold set fail.", Toast.LENGTH_SHORT).show(); + } + break; + case R.id.FMR_EM_DESENSE_RSSI_OK: + String deRssi = mEditDesenseRssi.getText().toString(); + int deRssi_edit = 0; + try { + deRssi_edit = Integer.valueOf(deRssi); + } catch (NumberFormatException e) { + Log.e(TAG, "click desense rssi button:" + e); + Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show(); + mEditDesenseRssi.setText("0"); + return; + } + mButtonDesenseRssi.setEnabled(false); + boolean isDeRssiOk = mService.setEmth(1, deRssi_edit); + mButtonDesenseRssi.setEnabled(true); + if (isDeRssiOk) { + Toast.makeText(FmRadioEmActivity.this, "Desense Rssi Threshold set OK.", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(FmRadioEmActivity.this, "Desense Rssi Threshold set fail.", Toast.LENGTH_SHORT).show(); + } + break; + case R.id.FMR_EM_MUTE_GAIN_OK: + String mutegain = mEditMuteGain.getText().toString(); + int mutegain_edit = 0; + try { + mutegain_edit = Integer.valueOf(mutegain); + } catch (NumberFormatException e) { + Log.e(TAG, "click mute gain button:" + e); + Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show(); + mEditMuteGain.setText("0"); + return; + } + mButtonMuteGain.setEnabled(false); + boolean isMuteOk = mService.setEmth(2, mutegain_edit); + mButtonMuteGain.setEnabled(true); + if (isMuteOk) { + Toast.makeText(FmRadioEmActivity.this, "Software mute gain set OK.", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(FmRadioEmActivity.this, "Software mute gain set fail.", Toast.LENGTH_SHORT).show(); + } + break; + case R.id.FMR_EM_CMD_OK: + String cmd0 = mEditCMD0.getText().toString(); + String cmd1 = mEditCMD1.getText().toString(); + String cmd2 = mEditCMD2.getText().toString(); + String cmd3 = mEditCMD3.getText().toString(); + String cmd4 = mEditCMD4.getText().toString(); + String cmd5 = mEditCMD5.getText().toString(); + String cmd6 = mEditCMD6.getText().toString(); + String cmd7 = mEditCMD7.getText().toString(); + String cmd8 = mEditCMD8.getText().toString(); + String cmd9 = mEditCMD9.getText().toString(); + String cmd10 = mEditCMD10.getText().toString(); + String cmd11 = mEditCMD11.getText().toString(); + String cmd12 = mEditCMD12.getText().toString(); + String cmd13 = mEditCMD13.getText().toString(); + String cmd14 = mEditCMD14.getText().toString(); + String cmd15 = mEditCMD15.getText().toString(); + String cmd16 = mEditCMD16.getText().toString(); + String cmd17 = mEditCMD17.getText().toString(); + String cmd18 = mEditCMD18.getText().toString(); + String cmd19 = mEditCMD19.getText().toString(); + short[] cmdArray = new short[20]; + try { + cmdArray = new short[] { + Short.valueOf(cmd0), + Short.valueOf(cmd1), + Short.valueOf(cmd2), + Short.valueOf(cmd3), + Short.valueOf(cmd4), + Short.valueOf(cmd5), + Short.valueOf(cmd6), + Short.valueOf(cmd7), + Short.valueOf(cmd8), + Short.valueOf(cmd9), + Short.valueOf(cmd10), + Short.valueOf(cmd11), + Short.valueOf(cmd12), + Short.valueOf(cmd13), + Short.valueOf(cmd14), + Short.valueOf(cmd15), + Short.valueOf(cmd16), + Short.valueOf(cmd17), + Short.valueOf(cmd18), + Short.valueOf(cmd19)}; + } catch (Exception e) { + Log.e(TAG, "click cmd button:" + e); + Toast.makeText(FmRadioEmActivity.this, "bad format.", Toast.LENGTH_SHORT).show(); + return; + } + short[] cmds = mService.emcmd(cmdArray); + + if (cmds == null) { + Toast.makeText(FmRadioEmActivity.this, "cmd execute fail.", Toast.LENGTH_SHORT).show(); + Log.d(TAG, "cmd expand execute fail"); + return; + } + int size = cmds.length; + int count = 0; + String[] values = new String[]{"","","","",""}; + int line = -1; + while (count < size) { + if (count%4 == 0) { + line += 1; + } + values[line] += ("0X" + cmds[count]); + ++count; + } + mTextCMDReturn0.setText(values[0]); + mTextCMDReturn1.setText(values[1]); + mTextCMDReturn2.setText(values[2]); + mTextCMDReturn3.setText(values[3]); + mTextCMDReturn4.setText(values[4]); + break; + default : + Log.d(TAG, "invalid view id"); + } + } + }; + + /** + * FM Radio listener + */ + private FmRadioListener mFmRadioListener = new FmRadioListener() { + + /** + * call back method from service + */ + public void onCallBack(Bundle bundle) { + Message msg = mHandler.obtainMessage(bundle.getInt(FmRadioListener.CALLBACK_FLAG)); + msg.setData(bundle); + mHandler.sendMessage(msg); + } + }; + + /** + * Called when the activity is first created. + */ + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.d(TAG, "begin FMRadioEMActivity.onCreate"); + // Bind the activity to FM audio stream. + setVolumeControlStream(AudioManager.STREAM_MUSIC); + setContentView(R.layout.fm_rx_em); + // Init FM database + mContext = getApplicationContext(); + FmRadioStation.initFmDatabase(mContext); + + mTextStereoMono = (TextView) findViewById(R.id.FMR_Status_Stereomono); + mTextRssi = (TextView) findViewById(R.id.FMR_Status_RSSI); + mTextCapArray = (TextView) findViewById(R.id.FMR_Status_Caparray); + mTextRdsBler = (TextView) findViewById(R.id.FMR_RDS_Ratio); + mTextRdsPS = (TextView) findViewById(R.id.FMR_RDS_PS); + mTextRdsRT = (TextView) findViewById(R.id.FMR_RDS_RT); + mTextChipID = (TextView) findViewById(R.id.FMR_Chip_ID); + mTextECOVersion = (TextView) findViewById(R.id.FMR_ECO_Version); + mTextPatchVersion = (TextView) findViewById(R.id.FMR_Patch_Version); + mTextDSPVersion = (TextView) findViewById(R.id.FMR_DSP_Version); + mTextCMDReturn0 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN0); + mTextCMDReturn1 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN1); + mTextCMDReturn2 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN2); + mTextCMDReturn3 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN3); + mTextCMDReturn4 = (TextView) findViewById(R.id.FMR_EM_CMD_RETURN4); + mEditFreq = (EditText) findViewById(R.id.FMR_Freq_edit); + mEditRssiThreshold = (EditText) findViewById(R.id.FMR_EM_RSSI_THRESHOLD_edit); + mEditMuteGain = (EditText) findViewById(R.id.FMR_EM_MUTE_GAIN_edit); + mEditDesenseRssi = (EditText) findViewById(R.id.FMR_EM_DESENSE_RSSI_edit); + mEditCMD0 = (EditText) findViewById(R.id.FMR_EM_CMD_edit0); + mEditCMD1 = (EditText) findViewById(R.id.FMR_EM_CMD_edit1); + mEditCMD2 = (EditText) findViewById(R.id.FMR_EM_CMD_edit2); + mEditCMD3 = (EditText) findViewById(R.id.FMR_EM_CMD_edit3); + mEditCMD4 = (EditText) findViewById(R.id.FMR_EM_CMD_edit4); + mEditCMD5 = (EditText) findViewById(R.id.FMR_EM_CMD_edit5); + mEditCMD6 = (EditText) findViewById(R.id.FMR_EM_CMD_edit6); + mEditCMD7 = (EditText) findViewById(R.id.FMR_EM_CMD_edit7); + mEditCMD8 = (EditText) findViewById(R.id.FMR_EM_CMD_edit8); + mEditCMD9 = (EditText) findViewById(R.id.FMR_EM_CMD_edit9); + mEditCMD10 = (EditText) findViewById(R.id.FMR_EM_CMD_edit10); + mEditCMD11 = (EditText) findViewById(R.id.FMR_EM_CMD_edit11); + mEditCMD12 = (EditText) findViewById(R.id.FMR_EM_CMD_edit12); + mEditCMD13 = (EditText) findViewById(R.id.FMR_EM_CMD_edit13); + mEditCMD14 = (EditText) findViewById(R.id.FMR_EM_CMD_edit14); + mEditCMD15 = (EditText) findViewById(R.id.FMR_EM_CMD_edit15); + mEditCMD16 = (EditText) findViewById(R.id.FMR_EM_CMD_edit16); + mEditCMD17 = (EditText) findViewById(R.id.FMR_EM_CMD_edit17); + mEditCMD18 = (EditText) findViewById(R.id.FMR_EM_CMD_edit18); + mEditCMD19 = (EditText) findViewById(R.id.FMR_EM_CMD_edit19); + + mButtonRssiThreshold = (Button) findViewById(R.id.FMR_EM_RSSI_THRESHOLD_OK); + mButtonMuteGain = (Button) findViewById(R.id.FMR_EM_MUTE_GAIN_OK); + mButtonDesenseRssi = (Button) findViewById(R.id.FMR_EM_DESENSE_RSSI_OK); + mButtonCMD = (Button) findViewById(R.id.FMR_EM_CMD_OK); + + mButtonTune = (Button) findViewById(R.id.FMR_Freq_tune); + mRdAntennaS = (RadioButton) findViewById(R.id.FMR_Antenna_short); + mRdAntennaL = (RadioButton) findViewById(R.id.FMR_Antenna_long); + mRgAntenna = (RadioGroup) findViewById(R.id.FMR_Antenna_type); + mRdStereo = (RadioButton) findViewById(R.id.FMR_Stereomono_stereo); + mRdMono = (RadioButton) findViewById(R.id.FMR_Stereomono_mono); + + mRdAntennaS.setOnClickListener(mButtonClickListener); + mRdAntennaL.setOnClickListener(mButtonClickListener); + mRdStereo.setOnClickListener(mButtonClickListener); + mRdMono.setOnClickListener(mButtonClickListener); + mButtonTune.setOnClickListener(mButtonClickListener); + + mButtonRssiThreshold.setOnClickListener(mButtonClickListener); + mButtonMuteGain.setOnClickListener(mButtonClickListener); + mButtonDesenseRssi.setOnClickListener(mButtonClickListener); + mButtonCMD.setOnClickListener(mButtonClickListener); + + // Should start FM service first. +// ComponentName cn = startService(new Intent(FMRadioEMActivity.this, FmRadioService.class)); +// if (null == cn) { +// Log.e(TAG, "Error: Cannot start FM service"); +// } else { +// Log.d(TAG, "Start FM service successfully."); +// mIsServiceStarted = true; + /*mIsServiceBinded = bindService(new Intent(FMRadioEMActivity.this, FmRadioService.class), mServiceConnection, + Context.BIND_AUTO_CREATE); +// } + if (!mIsServiceBinded) { + Log.e(TAG, "Error: Cannot bind FM service"); + finish(); + return; + } else { + Log.d(TAG, "Bind FM service successfully."); + }*/ + + + IntentFilter filterHeadset = new IntentFilter(); + filterHeadset.addAction(Intent.ACTION_HEADSET_PLUG); + mHeadsetConnectionReceiver = new HeadsetConnectionReceiver(); + Log.d(TAG, "Register HeadsetConnectionReceiver"); + registerReceiver(mHeadsetConnectionReceiver, filterHeadset); + + // Get all the views and set their actions. + mCurrentStation = FmRadioStation.getCurrentStation(mContext); + mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); + refreshTextStatus(mIsPlaying); + Log.d(TAG, "end FMRadioEMActivity.onCreate"); + } + + /** + * called when bind service + */ + private ServiceConnection mServiceConnection = new ServiceConnection() { + + /** + * called when bind service + * @param className service name + * @param service service + */ + public void onServiceConnected(ComponentName className, IBinder service) { + Log.d(TAG, "begin FMRadioEMActivity.onServiceConnected"); + mService = ((FmRadioService.ServiceBinder)service).getService(); + if (null == mService) { + Log.e(TAG, "Error: null interface"); + finish(); + return; + } + + mService.registerFmRadioListener(mFmRadioListener); + if (!isServiceInited()) { + Log.d(TAG, "FM service is not init."); + initService(mCurrentStation); + refreshTextStatus(false); + // InitialThread thread = new InitialThread(); + // thread.start(); + // mService.openDeviceAsync(); + Log.d(TAG, "onService connect.mCurrentStation: " + mCurrentStation); + mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + + } else { + Log.d(TAG, "FM service is already init."); + if (isDeviceOpen()) { + // Get the current frequency in service and save it into + // database. + int iFreq = getFrequency(); + if (FmRadioUtils.isValidStation(iFreq)) { + if (mCurrentStation != iFreq) { + Log.d(TAG, "The frequency in FM service is not same as in database."); + mCurrentStation = iFreq; + // Save the current station frequency into data + // base. + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + } else { + Log.d(TAG, "The frequency in FM service is same as in database."); + } + } else { + Log.e(TAG, "Error: invalid frequency in service."); + } + + mIsPlaying = isPowerUp(); + + if (mIsPlaying) { + Log.d(TAG, "FM is already power up."); + refreshTextStatus(true); + } + + if (mIsPlaying) { + // Update the RDS text view. + mPSString = getPS(); + mLRTextString = getLRText(); + mHandler.sendEmptyMessage(MSGID_UPDATE_RDS); + } + + } else { + // This is theoretically never happen. + Log.e(TAG, "Error: FM device is not open"); + } + mHandler.sendEmptyMessage(MSGID_INIT_OK); + } + Log.d(TAG, "<<< FMRadioEMActivity.onServiceConnected"); + } + + public void onServiceDisconnected(ComponentName className) { + Log.d(TAG, ">>> FMRadioEMActivity.onServiceDisconnected"); + mService = null; + Log.d(TAG, "<<< FMRadioEMActivity.onServiceDisconnected"); + } + }; + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + Log.d(TAG, ">>> handleMessage what: " + msg.what); + if (mIsDestroying) { + Log.d(TAG, "Warning: app is being destroyed."); + Log.d(TAG, "<<< handleMessage"); + return; + } + Bundle bundle; + switch (msg.what) { + case MSGID_INIT_OK: + mTextChipID.setText(getChipId()); + mTextECOVersion.setText(getEcoVersion()); + mTextPatchVersion.setText(getPatchVersion()); + mTextDSPVersion.setText(getDspVersion()); + break; + case MSGID_TICK_EVENT: + bundle = msg.getData(); + mTextRdsBler.setText(bundle.getString(RDS_BLER_STRING)); + mTextRssi.setText(bundle.getString(RDS_RSSI_STRING)); + mTextStereoMono.setText(bundle.getString(RDS_STEREMONO_STRING)); + mTextCapArray.setText(bundle.getString(RDS_CAPARRAY_STRING)); + break; + + case FmRadioListener.MSGID_POWERUP_FINISHED: + if (isSpeakerUsed()) { +// switchAntenna(0); + mRgAntenna.check(R.id.FMR_Antenna_short); + } else { +// switchAntenna(1); + mRgAntenna.check(R.id.FMR_Antenna_long); + } + bundle = msg.getData(); + mIsPlaying = bundle.getBoolean(FmRadioListener.KEY_IS_POWER_UP); + mHandler.sendEmptyMessage(MSGID_INIT_OK); + refreshTextStatus(true); + break; + + case FmRadioListener.MSGID_SWITCH_ANNTENNA: + bundle = msg.getData(); + boolean isSwitch = bundle.getBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA); + if (isSwitch) { +// mService.powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + Log.d(TAG, "mHandler. switch anntenna ok"); + } + break; + case FmRadioListener.MSGID_TUNE_FINISHED: + bundle = msg.getData(); + float frequency = bundle.getFloat(FmRadioListener.KEY_TUNE_TO_STATION); + mCurrentStation = FmRadioUtils.computeStation(frequency); + // Save the current station frequency into data base. +// FmRadioStation.setCurrentStation(mContext, mCurrentStation); + refreshTextStatus(true); + break; + + case FmRadioListener.LISTEN_PS_CHANGED: + case FmRadioListener.LISTEN_RT_CHANGED: + bundle = msg.getData(); + mPSString = bundle.getString(FmRadioListener.KEY_PS_INFO); + mLRTextString = bundle.getString(FmRadioListener.KEY_RT_INFO); + showRDS(); + break; + case FmRadioListener.LISTEN_RDSSTATION_CHANGED: + bundle = msg.getData(); + mCurrentStation = bundle.getInt(FmRadioListener.KEY_RDS_STATION); + break; + default: + Log.d(TAG, "invalid view id"); + } + Log.d(TAG, "<<< handleMessage"); + } + + }; + + private String formatCapArray(int raw) { + final float[] pF = { 0.166f, 0.332f, 0.664f, 1.33f, 2.66f, 5.31f, 10.6f, 18.6f }; + + float sum = 0.0f; + for (int i = 0; i < pF.length; i++) { + final int base = 6; + sum += (((raw >> (base + i)) & 0x1) == 1 ? pF[i] : 0.0); + } + return String.format("%.2f", sum); + } + + @Override + protected void onStart() { + super.onStart(); + mIsServiceBinded = bindService(new Intent(FmRadioEmActivity.this, FmRadioService.class), mServiceConnection, + Context.BIND_AUTO_CREATE); +// } + if (!mIsServiceBinded) { + Log.e(TAG, "Error: Cannot bind FM service"); + finish(); + return; + } else { + Log.d(TAG, "Bind FM service successfully."); + } + } + /** + * called when activity resume + */ + public void onResume() { + super.onResume(); + /*final int oneSecond = 1000; + mHandler.sendEmptyMessageDelayed(MSGID_TICK_EVENT, oneSecond);*/ + readTickEvent(); + } + + /** + * called when activity pause + */ + public void onPause() { + mHandler.removeMessages(MSGID_TICK_EVENT); + stopTickEventThread(); + super.onPause(); + } + + @Override + protected void onStop() { + Log.d(TAG, "start FMRadioActivity.onStop"); + if (mIsServiceBinded) { + unbindService(mServiceConnection); + mIsServiceBinded = false; + } + Log.d(TAG, "end FMRadioActivity.onStop"); + super.onStop(); + } + + /** + * called when activity destroy + */ + public void onDestroy() { + Log.d(TAG, ">>> FMRadioEMActivity.onDestroy"); + mIsDestroying = true; + mHandler.removeCallbacks(null); + if (null != mHeadsetConnectionReceiver) { + Log.d(TAG, "Unregister headset broadcast receiver."); + unregisterReceiver(mHeadsetConnectionReceiver); + mHeadsetConnectionReceiver = null; + } + // Should powerdown FM. + if (mIsPlaying) { + Log.d(TAG, "FM is Playing. So stop it."); +// powerDown(); + mService.powerDownAsync(); + mIsPlaying = false; + } + if (null != mService) { + mService.unregisterFmRadioListener(mFmRadioListener); + } + mService = null; + mFmRadioListener = null; + + + Log.d(TAG, "<<< FMRadioEMActivity.onDestroy"); + super.onDestroy(); + } + + private boolean isAntennaAvailable() { + return mAudioManager.isWiredHeadsetOn(); + } + + private void tuneToStation(final int iStation) { + mService.tuneStationAsync(FmRadioUtils.computeFrequency(iStation)); + } + + + private void refreshTextStatus(boolean on) { + if (!on) { + mTextStereoMono.setText("X"); + mTextRssi.setText("X"); + mTextCapArray.setText("X"); + mTextRdsBler.setText("X"); + mTextRdsPS.setText("X"); + mTextRdsRT.setText("X"); + mEditFreq.setText(FmRadioUtils.formatStation(mCurrentStation)); + mRgAntenna.clearCheck(); + mButtonTune.setEnabled(false); + } else { + mButtonTune.setEnabled(true); + } + } + + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + } + + /*private int rdsset(boolean rdson) { + return mIsRDSSupported ? setRDS(rdson) : -1; + }*/ + + private void showRDS() { + Log.v(TAG, "FMRadioEMActivity.showRDS PS : " + mPSString + "RT :" + mLRTextString); + mTextRdsPS.setText(mPSString); + mTextRdsRT.setText(mLRTextString); + } + + /** + * get chip id + * @return chip id + */ + public String getChipId() { + int[] hardwareVersion = getHardwareVersion(); + int chipId = 0; + if (null != hardwareVersion) { + chipId = hardwareVersion[0]; + } + return getStringValue(chipId); + } + + /** + * get ECO version + * @return ECO version + */ + public String getEcoVersion() { + int[] hardwareVersion = getHardwareVersion(); + int ecoVersion = 0; + if (null != hardwareVersion) { + ecoVersion = hardwareVersion[1]; + } + return "E" + getStringValue(ecoVersion); + } + + /** + * get patch version + * @return patch version + */ + public String getPatchVersion() { + int[] hardwareVersion = getHardwareVersion(); + int patchVersion = 0; + if (null != hardwareVersion) { + final int patchVersionPosition = 3; + patchVersion = hardwareVersion[patchVersionPosition]; + } + String patchStr = getStringValue(patchVersion); + float patch = 0; + if (null != patchStr) { + try { + final int hundred = 100; + patch = Float.parseFloat(patchStr) / hundred; + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + return Float.toString(patch); + } + + /** + * get DSP version + * @return DSP version + */ + public String getDspVersion() { + int[] hardwareVersion = getHardwareVersion(); + int dspVersion = 0; + if (null != hardwareVersion) { + dspVersion = hardwareVersion[2]; + } + return "V" + getStringValue(dspVersion); + } + + private boolean isDeviceOpen() { + if (null != mService) { + return mService.isDeviceOpen(); + } + return false; + } + + private boolean isPowerUp() { + boolean bRet = false; + if (null != mService) { + return mService.isPowerUp(); + } + return false; + } + + private String getPS() { + if (null != mService) { + return mService.getPS(); + } + return null; + } + + private String getLRText() { + if (null != mService) { + return mService.getLRText(); + } + return null; + } + + private boolean isRdsSupported() { + if (null != mService) { + return mService.isRdsSupported(); + } + return false; + } + + private boolean isSpeakerUsed() { + if (null != mService) { + return mService.isSpeakerUsed(); + } + return true; + } + + private void initService(int iCurrentStation) { + if (null != mService) { + mService.initService(iCurrentStation); + } + } + + private boolean isServiceInited() { + if (null != mService) { + return mService.isServiceInited(); + } + return false; + } + + private int getFrequency() { + if (null != mService) { + return mService.getFrequency(); + } + return 0; + } + + /** + * read cap array + * @return cap array + */ + public int readCapArray() { + if (null != mService) { + return mService.getCapArray(); + } + return 0; + } + + /** + * get rssi value + * @return rssi value + */ + public int readRssi() { + if (null != mService) { + return mService.getRssi(); + } + return 0; + } + + /** + * get stereo or mono + * @return true is stereo, false mono + */ + public boolean getStereoMono() { + if (null != mService) { + return mService.getStereoMono(); + } + return false; + } + + /** + * set stereo or mono + * @param isMono mono or not + * @return whether success + */ + public void setStereoMono(boolean isMono) { +// if (null != mService) { +// return mService.setStereoMono(isMono); +// } +// return false; + mService.setStereoMono(isMono); + } + + /** + * switch antenna + * + * @param antenna + * antenna (0, long antenna, 1 short antenna) + * @return (0, success; 1 failed; 2 not support) + */ + public void switchAntenna(int type) { + /*if (null != mService) { + return mService.switchAntenna(type); + } + return 2;*/ + mService.switchAntennaAsync(type); + } + + /** + * read rds bler + * + * @return rds bler value + */ + public int readRdsBler() { + if (null != mService) { + return mService.getRdsBler(); + } + return 0; + } + + /** + * get hardware version + * @return hardware version information array(0, ChipId; 1, EcoVersion; 2, PatchVersion; 3, + * DSPVersion) + */ + public int[] getHardwareVersion() { + int[] hardwareVersion = null; + if (null != mService) { + hardwareVersion = mService.getHardwareVersion(); + } + Log.v(TAG, "getHardwareversion: " + Arrays.toString(hardwareVersion)); + return hardwareVersion; + } + + /** + * get actual version string + * @param convertData version data + * @return actual version string + */ + public String getStringValue(int convertData) { + StringBuilder temp = new StringBuilder(); + int quotient = convertData; + int remainder = 0; + while (quotient > 0) { + final int hexadecimal = 16; + remainder = quotient % hexadecimal; + quotient = quotient / hexadecimal; + temp = temp.append(remainder); + } + return temp.reverse().toString(); + } + + public void readTickEvent() { + final int interval = 1000; + + if (null != mTickEventThread) { + return; + } + mTickEventThread = new Thread() { + public void run() { + Log.d(TAG, ">>> tick envent Thread run()"); + while (true) { + if (mIsTickEventExit) { + break; + } + + if (isDeviceOpen()) { + Bundle bundle = new Bundle(3); + bundle.putString(RDS_BLER_STRING, String.format("%d%%", readRdsBler())); + bundle.putString(RDS_RSSI_STRING, String.format("%d", readRssi())); + bundle.putString(RDS_STEREMONO_STRING, getStereoMono() ? "Stereo" : "Mono"); + String capStr = "N/A"; + if (!mRdAntennaL.isChecked()) { + capStr = formatCapArray(readCapArray()); + } + bundle.putString(RDS_CAPARRAY_STRING, capStr); + Message msg = mHandler.obtainMessage(MSGID_TICK_EVENT); + msg.setData(bundle); + mHandler.sendMessage(msg); + } + // Do not handle other events. + // Sleep 500ms to reduce inquiry frequency + try { + final int hundredMillisecond = 1000; + Thread.sleep(hundredMillisecond); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Log.d(TAG, "get tick information"); + } + Log.d(TAG, "<<< tick envent Thread run()"); + } + }; + Log.d(TAG, "Start tick event Thread."); + mTickEventThread.start(); + } + + private void stopTickEventThread() { + Log.d(TAG, ">>> stopTickEventThread"); + if (null != mTickEventThread) { + mIsTickEventExit = true; + mTickEventThread = null; + } + Log.d(TAG, "<<< stopTickEventThread"); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java new file mode 100755 index 0000000..2ad6807 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioFavorite.java @@ -0,0 +1,533 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.ActionBar; +import android.app.Activity; +import android.app.Dialog; +import android.app.LoaderManager.LoaderCallbacks; +import android.content.Context; +import android.content.CursorLoader; +import android.content.Intent; +import android.content.Loader; +import android.database.Cursor; +import android.media.AudioManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.ContextMenu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.SimpleCursorAdapter; +import android.widget.TextView; +import android.widget.Toast; + +import com.mediatek.fmradio.FmRadioService.OnExitListener; +import com.mediatek.fmradio.dialogs.AddFavoriteDialog; +import com.mediatek.fmradio.dialogs.DeleteFavoriteDialog; +import com.mediatek.fmradio.dialogs.EditFavoriteDialog; +import com.mediatek.fmradio.ext.IProjectStringExt; + +/** + * This class interact with user, provider edit channel information, such as add + * to favorite, edit favorite, delete from favorite + */ +public class FmRadioFavorite extends Activity implements LoaderCallbacks<Cursor>, + AddFavoriteDialog.AddFavoriteListener, EditFavoriteDialog.EditFavoriteListener, + DeleteFavoriteDialog.DeleteFavoriteListener { + // Logging + private static final String TAG = "FmRx/Favorite"; + + private static final String ADD_FAVORITE = "AddFavorite"; + private static final String EDIT_FAVORITE = "EditFavorite"; + private static final String DELETE_FAVORITE = "DeleteFavorite"; + + public static final String ACTIVITY_RESULT = "ACTIVITY_RESULT"; + + private static final int CONTMENU_ID_EDIT = 1; // content menu id edit + private static final int CONTMENU_ID_DELETE = 2; // content menu id delete + private static final int CONTMENU_ID_ADD = 3; // content menu id add + + private static final String FAVORITE_NAME = "FAVORITE_NAME"; + private static final String FAVORITE_FREQ = "FAVORITE_FREQ"; + + private ListView mLvFavorites = null; // list view + private ChannelListAdapter mAdapter = null; // adapter use to update UI + private String mDlgStationName = null; // Record the long clicked station name + private int mDlgStationFreq = 0; // Record the long clicked station frequency + private Context mContext = null; // application context + private OnExitListener mExitListener = null; + + // Plugin + private IProjectStringExt mProjectStringExt = null; + + /** + * on create + * + * @param savedInstanceState The save instance state + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.d(TAG, "begin FmRadioFavorite.onCreate"); + // Bind the activity to FM audio stream. + setVolumeControlStream(AudioManager.STREAM_MUSIC); + getWindow().requestFeature(Window.FEATURE_ACTION_BAR); + setContentView(R.layout.favorite); + // display action bar and navigation button + ActionBar actionBar = getActionBar(); + actionBar.setTitle(R.string.favorite_manager); + actionBar.setDisplayHomeAsUpEnabled(true); + mContext = getApplicationContext(); + if (savedInstanceState != null) { + mDlgStationName = savedInstanceState.getString(FAVORITE_NAME); + mDlgStationFreq = savedInstanceState.getInt(FAVORITE_FREQ); + } + + mProjectStringExt = ExtensionUtils.getExtension(mContext); + + mAdapter = new ChannelListAdapter( + this, + R.layout.simpleadapter, + null, + new String[] { + FmRadioStation.Station.COLUMN_STATION_TYPE, + FmRadioStation.Station.COLUMN_STATION_FREQ, + FmRadioStation.Station.COLUMN_STATION_NAME + }, + new int[] { + R.id.lv_station_type, R.id.lv_station_freq, R.id.lv_station_name + }); + mLvFavorites = (ListView) findViewById(R.id.station_list); + TextView emptyView = (TextView) findViewById(R.id.empty); + mLvFavorites.setEmptyView(emptyView); + mLvFavorites.setAdapter(mAdapter); // set adapter + getLoaderManager().initLoader(0, null, this); // initial loader + + mLvFavorites.setOnItemClickListener( + new AdapterView.OnItemClickListener() { + /** + * Click list item will finish activity and pass value to + * other activity + * + * @param parent adapter view + * @param view item view + * @param position current position + * @param id current id + */ + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, + long id) { + // Set the selected frequency to main UI and finish the + // favorite manager. + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + float frequency = 0; + try { + frequency = Float.parseFloat(textView.getText().toString()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + Intent intentResult = new Intent(); + intentResult.putExtra(ACTIVITY_RESULT, FmRadioUtils + .computeStation(frequency)); + setResult(RESULT_OK, intentResult); + finish(); + } + } + ); + + mLvFavorites.setOnCreateContextMenuListener( + /** + * create context menu + * + * @param menu context menu + * @param view context menu view + * @param menuInfo context menu information + */ + new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu menu, View view, + ContextMenu.ContextMenuInfo menuInfo) { + menu.setHeaderTitle(R.string.contmenu_title); + Cursor cursor = mAdapter.getCursor(); + int pos = ((AdapterView.AdapterContextMenuInfo) menuInfo).position; + cursor.moveToPosition(pos); + int stationType = cursor.getInt( + cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_TYPE)); + if (FmRadioStation.STATION_TYPE_SEARCHED == stationType) { + // Searched station. + menu.add(0, CONTMENU_ID_ADD, 0, mProjectStringExt.getProjectString(mContext, + R.string.add_to_favorite, R.string.add_to_favorite1)); + } else { + // Favorite station. + menu.add(0, CONTMENU_ID_EDIT, 0, R.string.contmenu_item_edit); + menu.add(0, CONTMENU_ID_DELETE, 0, mProjectStringExt.getProjectString(mContext, + R.string.contmenu_item_delete, R.string.contmenu_item_delete1)); + } + } + } + ); + + // Finish favorite when exit FM + mExitListener = new FmRadioService.OnExitListener() { + @Override + public void onExit() { + Log.d(TAG, "onExit()"); + Handler mainHandler = new Handler(Looper.getMainLooper()); + mainHandler.post(new Runnable() { + @Override + public void run() { + FmRadioFavorite.this.finish(); + } + }); + } + }; + FmRadioService.registerExitListener(mExitListener); + Log.d(TAG, "end FmRadioFavorite.onCreate"); + } + + /** + * Handle the event when context menu selected + * + * @param item selected menu item + * + * @return whether need to handle other context item + */ + @Override + public boolean onContextItemSelected(MenuItem item) { + // get list view position + int position = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).position; + // get item view + View itemView = mLvFavorites.getAdapter().getView(position, null, mLvFavorites); + // get station frequency and station name of item view + TextView stationFreqView = (TextView) itemView.findViewById(R.id.lv_station_freq); + TextView stationNameView = (TextView) itemView.findViewById(R.id.lv_station_name); + mDlgStationFreq = FmRadioUtils.computeStation( + Float.parseFloat(stationFreqView.getText().toString())); + mDlgStationName = stationNameView.getText().toString(); + + switch (item.getItemId()) { + case CONTMENU_ID_ADD: + // show add favorite dialog + showAddFavoriteDialog(); + break; + + case CONTMENU_ID_EDIT: + // show edit favorite dialog + showEditFavoriteDialog(); + break; + + case CONTMENU_ID_DELETE: + // show delete favorite dialog + showDeleteFavoriteDialog(); + break; + + default: + Log.d(TAG, "invalid menu item"); + break; + } + return false; + } + + /** + * When menu is selected + * + * @param item The selected menu item + * + * @return true to consume it, false to can handle other + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + super.onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + /** + * Create cursor loader to initial list view + * + * @param id The id whose loader will be created + * @param args Any arguments specified by caller + * + * @return cursor The loader according query result + */ + @Override + public Loader<Cursor> onCreateLoader(int id, Bundle args) { + Uri uri = FmRadioStation.Station.CONTENT_URI; + String select = FmRadioStation.Station.COLUMN_STATION_TYPE + " IN (?, ?)"; + String order = FmRadioStation.Station.COLUMN_STATION_TYPE + "," + + FmRadioStation.Station.COLUMN_STATION_FREQ; + CursorLoader cursorLoader = new CursorLoader( + this, + uri, + FmRadioStation.COLUMNS, + select, + new String[] { + String.valueOf(FmRadioStation.STATION_TYPE_FAVORITE), + String.valueOf(FmRadioStation.STATION_TYPE_SEARCHED) + }, + order); + return cursorLoader; + } + + /** + * Swap adapter cursor when load finished + * + * @param loader The cursor loader + * @param data The new cursor + */ + @Override + public void onLoadFinished(Loader<Cursor> loader, Cursor data) { + mAdapter.swapCursor(data); + } + + /** + * Set adapter as null when loader reset + * + * @param loader The cursor loader + */ + @Override + public void onLoaderReset(Loader<Cursor> loader) { + mAdapter.swapCursor(null); + } + + /** + * This class use associate cursor with adapter item view + */ + static class ChannelListAdapter extends SimpleCursorAdapter { + public ChannelListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { + super(context, layout, c, from, to); + } + + /** + * This class use to manage view + */ + static class ViewHolder { + ImageView mStationTypeView; + TextView mStationFreqView; + TextView mStationNameView; + } + + /** + * Create item view + * + * @param context The context + * @param cursor The cursor + * @param parent The list view group + */ + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + View view = super.newView(context, cursor, parent); + ViewHolder viewHolder = new ViewHolder(); + viewHolder.mStationTypeView = (ImageView) view.findViewById(R.id.lv_station_type); + viewHolder.mStationFreqView = (TextView) view.findViewById(R.id.lv_station_freq); + viewHolder.mStationNameView = (TextView) view.findViewById(R.id.lv_station_name); + view.setTag(viewHolder); + return view; + } + + /** + * Bind cursor data to list view + * + * @param view The item view + * @param context The The context + * @param cursor The cursor + */ + @Override + public void bindView(View view, Context context, Cursor cursor) { + ViewHolder viewHolder = (ViewHolder) view.getTag(); + int stationType = cursor.getInt( + cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_TYPE)); + int stationFreq = cursor.getInt( + cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_FREQ)); + String stationName = cursor.getString( + cursor.getColumnIndex(FmRadioStation.Station.COLUMN_STATION_NAME)); + if (FmRadioStation.STATION_TYPE_FAVORITE == stationType) { + viewHolder.mStationTypeView.setImageResource(R.drawable.btn_fm_favorite_on); + } else { + viewHolder.mStationTypeView.setImageResource(0); + } + viewHolder.mStationFreqView.setText(FmRadioUtils.formatStation(stationFreq)); + viewHolder.mStationNameView.setText(stationName); + } + } + + private void showAddFavoriteDialog() { + AddFavoriteDialog fragment = AddFavoriteDialog.newInstance(mDlgStationName, + mDlgStationFreq); + fragment.show(getFragmentManager(), ADD_FAVORITE); + + } + + private void showEditFavoriteDialog() { + EditFavoriteDialog newFragment = EditFavoriteDialog.newInstance(mDlgStationName, + mDlgStationFreq); + newFragment.show(getFragmentManager(), EDIT_FAVORITE); + } + + private void showDeleteFavoriteDialog() { + DeleteFavoriteDialog newFragment = DeleteFavoriteDialog.newInstance(); + newFragment.show(getFragmentManager(), DELETE_FAVORITE); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putString(FAVORITE_NAME, mDlgStationName); + outState.putInt(FAVORITE_FREQ, mDlgStationFreq); + super.onSaveInstanceState(outState); + } + + /** + * Add searched station as favorite station + */ + public void addFavorite() { + AddFavoriteDialog dialogFragment = + ((AddFavoriteDialog) getFragmentManager().findFragmentByTag(ADD_FAVORITE)); + if (null == dialogFragment) { + return; + } + + Dialog dialog = dialogFragment.getDialog(); + if (null == dialog) { + return; + } + + EditText editText = (EditText) dialog.findViewById(R.id.dlg_add_station_name_text); + if (null == editText) { + return; + } + + String newName = editText.getText().toString().trim(); + // if user not input String, use previous displayed station name + // if not have previous displayed station name, use default station name + if (0 != newName.length()) { + mDlgStationName = newName; + } + // update the station name and station type in database + // according the frequency + FmRadioStation.updateStationToDb(mContext, mDlgStationName, + FmRadioStation.STATION_TYPE_FAVORITE, mDlgStationFreq); + mAdapter.notifyDataSetChanged(); + } + + /** + * Edit favorite station frequency and station name + */ + public void editFavorite() { + EditFavoriteDialog dialogFragment = + (EditFavoriteDialog) getFragmentManager().findFragmentByTag(EDIT_FAVORITE); + if (null == dialogFragment) { + return; + } + Dialog dialog = dialogFragment.getDialog(); + if (null == dialog) { + return; + } + + EditText nameEditText = (EditText) dialog.findViewById(R.id.dlg_edit_station_name_text); + EditText frequencyEditText = + (EditText) dialog.findViewById(R.id.dlg_edit_station_freq_text); + if ((null == nameEditText) || (null == frequencyEditText)) { + return; + } + String newName = nameEditText.getText().toString().trim(); + String newStationFreqStr = frequencyEditText.getText().toString().trim(); + // if user not input String, use previous displayed station name + // if not have previous displayed station name, use default station name + if (0 != newName.length()) { + mDlgStationName = newName; + } + + float newStationFreq = 0; + try { + newStationFreq = Float.parseFloat(newStationFreqStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + + int newStation = FmRadioUtils.computeStation(newStationFreq); + if (FmRadioUtils.isValidStation(newStation)) { + // if station is exist in channel list delete it + // ignore current station, because current station not display in + // listview + if (FmRadioStation.isStationExist(mContext, newStation, + FmRadioStation.STATION_TYPE_FAVORITE) && (newStation != mDlgStationFreq)) { + FmRadioStation.deleteStationInDb(mContext, newStation, + FmRadioStation.STATION_TYPE_FAVORITE); + } else if (FmRadioStation.isStationExist(mContext, newStation, + FmRadioStation.STATION_TYPE_SEARCHED)) { + FmRadioStation.deleteStationInDb(mContext, newStation, + FmRadioStation.STATION_TYPE_SEARCHED); + } + FmRadioStation.updateStationToDb(mContext, mDlgStationName, mDlgStationFreq, + newStation, + FmRadioStation.STATION_TYPE_FAVORITE); + mAdapter.notifyDataSetChanged(); + } else { + Toast.makeText(getApplicationContext(), R.string.toast_invalid_frequency, + Toast.LENGTH_SHORT).show(); + } + } + + /** + * Delete favorite from favorite channel list, make it as searched station + */ + public void deleteFavorite() { + // update the station type from favorite to searched. + FmRadioStation.updateStationToDb(mContext, mDlgStationName, + FmRadioStation.STATION_TYPE_SEARCHED, mDlgStationFreq); + mAdapter.notifyDataSetChanged(); + } + + @Override + protected void onDestroy() { + Log.d(TAG, "onDestory()"); + FmRadioService.unregisterExitListener(mExitListener); + super.onDestroy(); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java new file mode 100755 index 0000000..1250fc6 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioListener.java @@ -0,0 +1,140 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.os.Bundle; + +/** + * Activity connect FMRadio service should implements this interface to update + * ui or status + */ +public interface FmRadioListener { + /** + * directly call back from service to activity + */ + // FM RDS station changed + int LISTEN_RDSSTATION_CHANGED = 0x00100010; + + // FM PS information changed + int LISTEN_PS_CHANGED = 0x00100011; + + // FM RT information changed + int LISTEN_RT_CHANGED = 0x00100100; + + // FM Record state changed + int LISTEN_RECORDSTATE_CHANGED = 0x00100101; // 1048833 + + // FM record error occur + int LISTEN_RECORDERROR = 0x00100110; // 1048848 + + // FM record mode change + int LISTEN_RECORDMODE_CHANGED = 0x00100111; // 4018849 + + // FM Record state changed + int LISTEN_SPEAKER_MODE_CHANGED = 0x00101000; // 1052672 + + // Bundle keys + String SWITCH_ANNTENNA_VALUE = "switch_anntenna_value"; + String CALLBACK_FLAG = "callback_flag"; + String KEY_IS_POWER_UP = "key_is_power_up"; + String KEY_IS_POWER_DOWN = "key_is_power_down"; + String KEY_IS_SWITCH_ANNTENNA = "key_is_switch_anntenna"; + String KEY_IS_TUNE = "key_is_tune"; + String KEY_TUNE_TO_STATION = "key_tune_to_station"; + String KEY_IS_SEEK = "key_is_seek"; + String KEY_SEEK_TO_STATION = "key_seek_to_station"; + String KEY_IS_SCAN = "key_is_scan"; + String KEY_RDS_STATION = "key_rds_station"; + String KEY_PS_INFO = "key_ps_info"; + String KEY_RT_INFO = "key_rt_info"; + String KEY_STATION_NUM = "key_station_num"; + + // Audio focus related + String KEY_AUDIOFOCUS_CHANGED = "key_audiofocus_changed"; + + // Recording + String KEY_RECORDING_STATE = "key_is_recording_state"; + String KEY_RECORDING_ERROR_TYPE = "key_recording_error_type"; + String KEY_IS_RECORDING_MODE = "key_is_recording_mode"; + + // For change speaker/earphone mode + String KEY_IS_SPEAKER_MODE = "key_is_speaker_mode"; + + /** + * handle message: call back from service to activity + */ + // Message to handle + int MSGID_UPDATE_RDS = 1; + int MSGID_UPDATE_CURRENT_STATION = 2; + int MSGID_ANTENNA_UNAVAILABE = 3; + int MSGID_SWITCH_ANNTENNA = 4; + int MSGID_SET_RDS_FINISHED = 5; + int MSGID_SET_CHANNEL_FINISHED = 6; + int MSGID_SET_MUTE_FINISHED = 7; + // Fm main + int MSGID_POWERUP_FINISHED = 9; + int MSGID_POWERDOWN_FINISHED = 10; + int MSGID_FM_EXIT = 11; + int MSGID_SCAN_CANCELED = 12; + int MSGID_SCAN_FINISHED = 13; + int MSGID_AUDIOFOCUS_FAILED = 14; + int MSGID_TUNE_FINISHED = 15; + int MSGID_SEEK_FINISHED = 16; + int MSGID_ACTIVE_AF_FINISHED = 18; + // Recording + int MSGID_RECORD_STATE_CHANGED = 19; + int MSGID_RECORD_ERROR = 20; + int MSGID_RECORD_MODE_CHANED = 21; + int MSGID_STARTRECORDING_FINISHED = 22; + int MSGID_STOPRECORDING_FINISHED = 23; + int MSGID_STARTPLAYBACK_FINISHED = 24; + int MSGID_STOPPLAYBACK_FINISHED = 25; + int MSGID_SAVERECORDING_FINISHED = 26; + // Audio focus related + int MSGID_AUDIOFOCUS_CHANGED = 30; + + int NOT_AUDIO_FOCUS = 33; + + // For refresh time + int MSGID_REFRESH = 101; + + /** + * Call back method to activity from service + */ + void onCallBack(Bundle bundle); +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java new file mode 100755 index 0000000..8f86268 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioNative.java @@ -0,0 +1,253 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +/** + * This class define FM native interface, will description FM native interface + */ +public class FmRadioNative { + static { + System.loadLibrary("fmjni"); + } + + /** + * Open FM device, call before power up + * + * @return (true,success; false, failed) + */ + static native boolean openDev(); + + /** + * Close FM device, call after power down + * + * @return (true, success; false, failed) + */ + static native boolean closeDev(); + + /** + * power up FM with frequency use long antenna + * + * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5) + * + * @return (true, success; false, failed) + */ + static native boolean powerUp(float frequency); + + /** + * Power down FM + * + * @param type (0, FMRadio; 1, FMTransimitter) + * + * @return (true, success; false, failed) + */ + static native boolean powerDown(int type); + + /** + * tune to frequency + * + * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5) + * + * @return (true, success; false, failed) + */ + static native boolean tune(float frequency); + + /** + * seek with frequency in direction + * + * @param frequency frequency(50KHZ, 87.55; 100KHZ, 87.5) + * @param isUp (true, next channel; false previous channel) + * + * @return frequency(float) + */ + static native float seek(float frequency, boolean isUp); + + /** + * Auto scan(from 87.50-108.00) + * + * @return The scan channel array(short) + */ + static native short[] autoScan(); + + /** + * Stop scan, also can stop seek, other native when scan should call stop + * scan first, else will execute wait auto scan finish + * + * @return (true, can stop scan process; false, can't stop scan process) + */ + static native boolean stopScan(); + + /** + * Open or close rds fuction + * + * @param rdson The rdson (true, open; false, close) + * + * @return rdsset + */ + static native int setRds(boolean rdson); + + /** + * Read rds events + * + * @return rds event type + */ + static native short readRds(); + + /** + * Get program service(program name) + * + * @return The program name + */ + static native byte[] getPs(); + + /** + * Get radio text, RDS standard not support Chinese character + * + * @return The radio text(byte) + */ + static native byte[] getLrText(); + + /** + *Active alternative frequencies + * + * @return The frequency(float) + */ + static native short activeAf(); + + /** + * Mute or unmute FM voice + * + * @param mute (true, mute; false, unmute) + * + * @return (true, success; false, failed) + */ + static native int setMute(boolean mute); + + /** + * Inquiry if RDS is support in driver + * + * @return (1, support; 0, NOT support; -1, error) + */ + static native int isRdsSupport(); + + /** + * Switch antenna + * + * @param antenna antenna (0, long antenna, 1 short antenna) + * + * @return (0, success; 1 failed; 2 not support) + */ + static native int switchAntenna(int antenna); + + /** + * Set Fm status to tell native RX or TX is on + * @param which 0 is RX, 1 is TX + * @param on true is on + * @return + */ + static native boolean setFmStatus(int which, boolean on); + + /** + * Get the native Fm status + * @param which 0 is RX ON, 1 is TX ON, 2 is TX Scaning + * @return true if dothing + */ + static native boolean getFmStatus(int which); + + // FM EM start + /** + * get rssi from hardware(use for engineer mode) + * + * @return rssi value + */ + static native int readRssi(); + + /** + * Inquiry if fm stereo mono(true, stereo; false mono) + * + * @return (true, stereo; false, mono) + */ + static native boolean stereoMono(); + + /** + * Force set to stero/mono mode + * + * @param isMono + * (true, mono; false, stereo) + * @return (true, success; false, failed) + */ + static native boolean setStereoMono(boolean isMono); + + /** + * Read cap array of short antenna + * + * @return cap array value + */ + static native short readCapArray(); + + /** + * read rds bler + * + * @return rds bler value + */ + static native short readRdsBler(); + + /** + * send variables to native, and get some variables return. + * @param val send to native + * @return get value from native + */ + static native short[] emcmd(short[] val); + + /** + * set RSSI, desense RSSI, mute gain soft + * @param index flag which will execute + * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold) + * @param value send to native + * @return execute ok or not + */ + static native boolean emsetth(int index, int value); + + /** + * get hardware version + * + * @return hardware version information array(0, ChipId; 1, EcoVersion; 2, PatchVersion; 3, + * DSPVersion) + */ + static native int[] getHardwareVersion(); + // FM EM end +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java new file mode 100755 index 0000000..08fb221 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java @@ -0,0 +1,2802 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.ActivityManager; +import android.app.ActivityManager.RunningAppProcessInfo; +import android.app.Notification; +import android.app.PendingIntent; +import android.app.Service; +import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; +import android.content.ContentProviderOperation; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.OperationApplicationException; +import android.content.res.Configuration; +import android.media.AudioManager; +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.media.AudioSystem; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Binder; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.os.RemoteException; +import android.util.Log; + +import com.mediatek.fmradio.FmRadioStation.Station; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +/* Vanzo:tanglei on: Sat, 14 Mar 2015 11:51:16 +0800 + */ +//import com.android.featureoption.FeatureOption; +// End of Vanzo:tanglei + +/** + * Background service to control FM or do background tasks. + */ +public class FmRadioService extends Service implements FmRecorder.OnRecorderStateChangedListener { + // Logging + private static final String TAG = "FmRx/Service"; + + // Broadcast messages from clients to FM service. + public static final String ACTION_TOFMSERVICE_POWERDOWN + = "com.mediatek.FMRadio.FMRadioService.ACTION_TOFMSERVICE_POWERDOWN"; + // Broadcast messages to FM Tx service. + public static final String ACTION_TOFMTXSERVICE_POWERDOWN + = "com.mediatek.FMTransmitter.FMTransmitterService.ACTION_TOFMTXSERVICE_POWERDOWN"; + // Broadcast messages to mATV service. + public static final String ACTION_TOATVSERVICE_POWERDOWN + = "com.mediatek.app.mtv.ACTION_REQUEST_SHUTDOWN"; + // Broadcast messages to music service. + public static final String ACTION_TOMUSICSERVICE_POWERDOWN + = "com.android.music.musicservicecommand.pause"; + // Broadcast messages from mATV service. + public static final String ACTION_FROMATVSERVICE_POWERUP = "com.mediatek.app.mtv.POWER_ON"; + + // Broadcast messages from other sounder APP to FM service + private static final String SOUND_POWER_DOWN_MSG = "com.android.music.musicservicecommand"; + private static final String CMDPAUSE = "pause"; + + // HandlerThread Keys + private static final String FM_FREQUENCY = "frequency"; + private static final String OPTION = "option"; + private static final String RECODING_FILE_NAME = "name"; + + // RDS events + // PS + private static final int RDS_EVENT_PROGRAMNAME = 0x0008; + // RT + private static final int RDS_EVENT_LAST_RADIOTEXT = 0x0040; + // AF + private static final int RDS_EVENT_AF = 0x0080; + + // Headset + private static final int HEADSET_PLUG_IN = 1; + // Short antenna support + private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport(); + + // Notification id + private static final int NOTIFICATION_ID = 1; + + // Set audio policy for FM + // should check AUDIO_POLICY_FORCE_FOR_MEDIA in audio_policy.h + private static final int FOR_PROPRIETARY = 1; + // Forced Use value + private int mForcedUseForMedia; + + // TX and RX interaction + private static final int CURRENT_RX_ON = 0; + private static final int CURRENT_TX_ON = 1; + private static final int CURRENT_TX_SCAN = 2; + + // FM recorder + FmRecorder mFmRecorder = null; + private BroadcastReceiver mSdcardListener = null; + private int mRecordState = FmRecorder.STATE_INVALID; + private int mRecorderErrorType = -1; + // If eject record sdcard, should set Value false to not record. + // Key is sdcard path(like "/storage/sdcard0"), V is to enable record or + // not. + private HashMap<String, Boolean> mSdcardStateMap = new HashMap<String, Boolean>(); + // The show name in save dialog but saved in service + // If modify the save title it will be not null, otherwise it will be null + private String mModifiedRecordingName = null; + // record the listener list, will notify all listener in list + private ArrayList<Record> mRecords = new ArrayList<Record>(); + // record FM whether in recording mode + private boolean mIsInRecordingMode = false; + // record sd card path when start recording + private static String sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + + // RDS + // PS String + private String mPSString = ""; + // RT String + private String mLRTextString = ""; + // PS RT + private boolean mIsPSRTEnabled = false; + // AF + private boolean mIsAFEnabled = false; + // RDS thread use to receive the information send by station + private Thread mRdsThread = null; + // record whether RDS thread exit + private boolean mIsRdsThreadExit = false; + + // State variables + // Record whether FM is in native scan state + private boolean mIsNativeScanning = false; + // Record whether FM is in scan thread + private boolean mIsScanning = false; + // Record whether FM is in seeking state + private boolean mIsNativeSeeking = false; + // Record whether FM is in native seek + private boolean mIsSeeking = false; + // Record whether searching progress is canceled + private boolean mIsStopScanCalled = false; + // Record whether is speaker used + private boolean mIsSpeakerUsed = false; + // Record whether device is open + private boolean mIsDeviceOpen = false; + // Record whether FM is power up + private boolean mIsPowerUp = false; + // Record whether is power uping, if so, should judge in activity back key. + private boolean mIsPowerUping = false; + // Record whether service is init + private boolean mIsServiceInited = false; + // Fm power down by loss audio focus,should make power down menu item can + // click + private boolean mIsMakePowerDown = false; + + // Instance variables + private Context mContext = null; + private AudioManager mAudioManager = null; + private ActivityManager mActivityManager = null; + private MediaPlayer mFmPlayer = null; + private WakeLock mWakeLock = null; + // Audio focus is held or not + private boolean mIsAudioFocusHeld = false; + // Focus transient lost + private boolean mPausedByTransientLossOfFocus = false; + private int mCurrentStation = FmRadioUtils.DEFAULT_STATION; + // Headset plug state (0:long antenna plug in, 1:long antenna plug out) + private int mValueHeadSetPlug = 1; + // For bind service + private final IBinder mBinder = new ServiceBinder(); + // Broadcast to receive the external event + private FmServiceBroadcastReceiver mBroadcastReceiver = null; + // Async handler + private FmRadioServiceHandler mFmServiceHandler; + // Lock for lose audio focus and receive SOUND_POWER_DOWN_MSG + // at the same time + // while recording call stop recording not finished(status is still + // RECORDING), but + // SOUND_POWER_DOWN_MSG will exitFm(), if it is RECORDING will discard the + // record. + // 1. lose audio focus -> stop recording(lock) -> set to IDLE and show save + // dialog + // 2. exitFm() -> check the record status, discard it if it is recording + // status(lock) + // Add this lock the exitFm() while stopRecording() + private Object mStopRecordingLock = new Object(); + // The listener for exit, should finish favorite when exit FM + private static OnExitListener sExitListener = null; + // Record FmRadioActivity state + private static boolean sActivityIsOnStop = false; + + @Override + public IBinder onBind(Intent intent) { + Log.d(TAG, "FmRadioService.onBind: " + intent); + return mBinder; + } + + /** + * class use to return service instance + */ + public class ServiceBinder extends Binder { + /** + * get FM service instance + * + * @return service instance + */ + FmRadioService getService() { + return FmRadioService.this; + } + } + + /** + * Broadcast monitor external event, Other app want FM stop, Phone shut + * down, screen state, headset state + */ + private class FmServiceBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, ">>> FmRadioService.onReceive"); + String action = intent.getAction(); + String command = intent.getStringExtra("command"); + Log.d(TAG, "Action/Command: " + action + " / " + command); + // other app want FM stop, stop FM + if (ACTION_TOFMSERVICE_POWERDOWN.equals(action) + || ACTION_FROMATVSERVICE_POWERUP.equals(action) + || (SOUND_POWER_DOWN_MSG.equals(action) && CMDPAUSE.equals(command))) { + // need remove all messages, make power down will be execute + mFmServiceHandler.removeCallbacksAndMessages(null); + + Log.d(TAG, "onReceive.SOUND_POWER_DOWN_MSG. exit FM"); + exitFm(); + stopSelf(); + // phone shut down, so exit FM + } else if (Intent.ACTION_SHUTDOWN.equals(action)) { + /** + * here exitFm, system will send broadcast, system will shut + * down, so fm does not need call back to activity + */ + mFmServiceHandler.removeCallbacksAndMessages(null); + exitFm(); + // screen on, if FM play, open rds + } else if (Intent.ACTION_SCREEN_ON.equals(action)) { + + setRdsAsync(true); + // screen off, if FM play, close rds + } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { + setRdsAsync(false); + // switch antenna when headset plug in or plug out + } else if (Intent.ACTION_HEADSET_PLUG.equals(action)) { + // switch antenna should not impact audio focus status + mValueHeadSetPlug = (intent.getIntExtra("state", -1) == HEADSET_PLUG_IN) ? 0 : 1; + switchAntennaAsync(mValueHeadSetPlug); + + if (SHORT_ANNTENNA_SUPPORT) { + boolean isSwitch = (switchAntenna(mValueHeadSetPlug) == 0) ? true : false; + Log.d(TAG, "onReceive.switch anntenna:isWitch:" + isSwitch); + + // Plug out->Speaker Mode; Plug in->Earphone Mode + boolean plugInEarphone = (0 == mValueHeadSetPlug); + // Need check to switch to earphone mode for audio will + // change to AudioSystem.FORCE_NONE + if (plugInEarphone) { + mForcedUseForMedia = AudioSystem.FORCE_NONE; + mIsSpeakerUsed = false; + } + //setSpeakerPhoneOn(!plugInEarphone); + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, !plugInEarphone); + notifyActivityStateChanged(bundle); + + powerUpAutoIfNeed(); + } else { + // Avoid Service is killed,and receive headset plug in + // broadcast again + if (!mIsServiceInited) { + Log.d(TAG, "onReceive.switch anntenna:service is not init"); + powerUpAutoIfNeed(); + return; + } + /* + * If ear phone insert and activity is + * foreground. power up FM automatic + */ + if ((0 == mValueHeadSetPlug) && isActivityForeground()) { + Log.d(TAG, "onReceive.switch anntenna:need auto power up"); + powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + } else if (1 == mValueHeadSetPlug) { + Log.d(TAG, "plug out earphone, need to stop fm"); + // ALPS01687760 Avoid sound from speaker after plug out earphone when recording + // plug out earphone will power down or exit, need to mute first anyway + setMute(true); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_POWERDOWN_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_POWERUP_FINISHED); + stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS); + + // Need check to switch to earphone mode for audio will + // change to AudioSystem.FORCE_NONE + setSpeakerPhoneOn(false); + + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false); + notifyActivityStateChanged(bundle); + } + } + + } else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)) { + int connectState = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, 0); + Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED: connectState=" + connectState + ", ispowerup=" + + mIsPowerUp); + handleBtConnectState(connectState); +/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:26:14 +0800 + * earphone key action + */ + } //else if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION && "com.mediatek.FMRadio.FMRadioService.NEXT_STATION".equals(action)) { + //seekStationAsync(FmRadioUtils.computeFrequency(mCurrentStation), true); +// End of Vanzo:tanglei + //} + else { + Log.w(TAG, "Error: undefined action."); + } + Log.d(TAG, "<<< FmRadioService.onReceive"); + } + } + + /** + * ALPS01756692 No sound after click FM app and power key + * Need to power up auto for two cases: + * case 1: Launcher click FM app, then quickly click Power key to lock phone. + * case 2: Launcher click FM app, then quickly click Home key. + * Because power up action is in FmRadioActivity.onServiceConnected(), these two cases + * will not callback onServiceConnected() cause FmRadioActivity.onStop() has called unbind() + */ + private void powerUpAutoIfNeed() { + if ((0 == mValueHeadSetPlug)) { + if (!mIsPowerUping && !mIsPowerUp && sActivityIsOnStop) { + Log.w(TAG, "Power up for start app then quick click power/home"); + int iCurrentStation = FmRadioStation.getCurrentStation(mContext); + powerUpAsync(FmRadioUtils.computeFrequency(iCurrentStation)); + } + } + } + + /** + * handle FM over BT connect state + * + * @param connectState + * FM over BT connect state + */ + private void handleBtConnectState(int connectState) { + if (!mIsPowerUp) { + return; + } + + switch (connectState) { + case BluetoothA2dp.STATE_CONNECTED: + //case BluetoothA2dp.STATE_PLAYING: + //case BluetoothA2dp.STATE_CONNECTING: + Log.d(TAG, "handleBtConnectState bt connected"); + changeToEarphoneMode(); + break; + case BluetoothA2dp.STATE_DISCONNECTED: + //case BluetoothA2dp.STATE_DISCONNECTING: + Log.d(TAG, "handleBtConnectState bt disconnected"); + changeToEarphoneMode(); + break; + default: + Log.d(TAG, "invalid fm over bt connect state"); + break; + } + + + } + + private void changeToEarphoneMode() { + setSpeakerPhoneOn(false); + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + // Always set to earphone mode when bt is connected or disconnected + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false); + notifyActivityStateChanged(bundle); + } + + /** + * Check if BT is connected + * @return true if current is playing with BT earphone + */ + public boolean isBtConnected() { + BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); + Log.d(TAG, "isBtConnected headset:" + + btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET) + + ", a2dp:" + btAdapter.getProfileConnectionState(BluetoothProfile.A2DP)); + int a2dpState = btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET); + return (BluetoothProfile.STATE_CONNECTED == a2dpState + || BluetoothProfile.STATE_CONNECTING == a2dpState); + } + + /** + * Handle sdcard mount/unmount event. 1. Update the sdcard state map 2. If + * the recording sdcard is unmounted, need to stop and notify + */ + private class SdcardListener extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + // If eject record sdcard, should set this false to not + // record. + updateSdcardStateMap(intent); + + if (mFmRecorder == null) { + Log.w(TAG, "SD receiver: FMRecorder is not present!!"); + return; + } + + String action = intent.getAction(); + if (Intent.ACTION_MEDIA_EJECT.equals(action) || + Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + // If not unmount recording sd card, do nothing; + if (isRecordingCardUnmount(intent)) { + Log.v(TAG, "MEDIA_EJECT"); + if (mFmRecorder.getState() == FmRecorder.STATE_RECORDING) { + Log.d(TAG, "old state is recording"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + mFmRecorder.discardRecording(); + } else { + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_RECORDSTATE_CHANGED); + bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, + FmRecorder.STATE_IDLE); + notifyActivityStateChanged(bundle); + } + } + return; + } + } + } + + /** + * whether antenna available + * + * @return true, antenna available; false, antenna not available + */ + public boolean isAntennaAvailable() { + return mAudioManager.isWiredHeadsetOn(); + } + + /** + * Set FM audio from speaker or not + * + * @param isSpeaker true if set FM audio from speaker + */ + public void setSpeakerPhoneOn(boolean isSpeaker) { + Log.d(TAG, ">>> FmRadioService.useSpeaker: " + isSpeaker); + mForcedUseForMedia = isSpeaker ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; + AudioSystem.setForceUse(FOR_PROPRIETARY, mForcedUseForMedia); + mIsSpeakerUsed = isSpeaker; + Log.d(TAG, "<<< FmRadioService.useSpeaker"); + } + + private boolean isSpeakerPhoneOn() { + return (mForcedUseForMedia == AudioSystem.FORCE_SPEAKER); + } + + /** + * open FM device, should be call before power up + * + * @return true if FM device open, false FM device not open + */ + private boolean openDevice() { + Log.d(TAG, ">>> FmRadioService.openDevice"); + if (!mIsDeviceOpen) { + mIsDeviceOpen = FmRadioNative.openDev(); + } + Log.d(TAG, "<<< FmRadioService.openDevice: " + mIsDeviceOpen); + return mIsDeviceOpen; + } + + /** + * close FM device + * + * @return true if close FM device success, false close FM device failed + */ + private boolean closeDevice() { + Log.d(TAG, ">>> FmRadioService.closeDevice"); + boolean isDeviceClose = false; + if (mIsDeviceOpen) { + isDeviceClose = FmRadioNative.closeDev(); + mIsDeviceOpen = !isDeviceClose; + } + Log.d(TAG, "<<< FmRadioService.closeDevice: " + isDeviceClose); + + // quit looper + mFmServiceHandler.getLooper().quit(); + return isDeviceClose; + } + + /** + * get FM device opened or not + * + * @return true FM device opened, false FM device closed + */ + public boolean isDeviceOpen() { + Log.d(TAG, "FmRadioService.isDeviceOpen: " + mIsDeviceOpen); + return mIsDeviceOpen; + } + + /** + * power up FM, and make FM voice output from earphone + * + * @param frequency + */ + public void powerUpAsync(float frequency) { + mIsPowerUping = true; + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_POWERUP_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private boolean powerUpFm(float frequency) { + Log.d(TAG, ">>> FmRadioService.powerUp: " + frequency); + if (mIsPowerUp) { + Log.d(TAG, "<<< FmRadioService.powerUp: already power up:" + mIsPowerUp); + return true; + } + + if (!requestAudioFocus()) { + // activity used for update powerdown menu + mIsMakePowerDown = true; + Log.d(TAG, "FM can't get audio focus when power up"); + sendBroadcastToStopOtherAPP(); + return false; + } + + // if device open fail when chip reset, it need open device again before + // power up + if (!mIsDeviceOpen) { + openDevice(); + } + + waitIfTxSearching(); + Log.d(TAG, "set CURRENT_RX_ON true, CURRENT_TX_ON false"); + FmRadioNative.setFmStatus(CURRENT_RX_ON, true); + FmRadioNative.setFmStatus(CURRENT_TX_ON, false); + sendBroadcastToStopOtherAPP(); + + Log.d(TAG, "service native power up start"); + if (!FmRadioNative.powerUp(frequency)) { + Log.e(TAG, "Error: powerup failed."); + return false; + } + Log.d(TAG, "service native power up end"); + mIsPowerUp = true; + // need mute after power up + setMute(true); + + // activity used for update powerdown menu + mIsMakePowerDown = false; + Log.d(TAG, "<<< FmRadioService.powerUp: " + mIsPowerUp); + return mIsPowerUp; + } + + // wait if TX is searching for timing issue + private void waitIfTxSearching() { + Log.d(TAG, ">>> waitIfTxSearching " + FmRadioNative.getFmStatus(CURRENT_TX_SCAN)); + long start = System.currentTimeMillis(); + // true for TX is searching + while (FmRadioNative.getFmStatus(CURRENT_TX_SCAN) == true) { + if (System.currentTimeMillis() - start > 5000) { + Log.e(TAG, "waitIfTxSearching timeout"); + break; + } + try { + Thread.sleep(100); + } catch (Exception e) { + } + } + Log.d(TAG, "<<< waitIfTxSearching"); + } + + private boolean startPlayFm(float frequency) { + Log.d(TAG, ">>> FmRadioService.initDevice: " + frequency); + + mCurrentStation = FmRadioUtils.computeStation(frequency); + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + // Add notification to the title bar. + showNotification(); + + // Start the RDS thread if RDS is supported. + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Start the RDS thread."); + startRdsThread(); + } + + if (!FmRadioUtils.isFmSuspendSupport()) { + if (!mWakeLock.isHeld()) { + mWakeLock.acquire(); + Log.d(TAG, "acquire wake lock"); + } + } + if (mIsSpeakerUsed != isSpeakerPhoneOn()) { + setSpeakerPhoneOn(mIsSpeakerUsed); + } + if (mRecordState != FmRecorder.STATE_PLAYBACK) { + enableFmAudio(true); + } + + setRds(true); + setMute(false); + + Log.d(TAG, "<<< FmRadioService.initDevice: " + mIsPowerUp); + return mIsPowerUp; + } + + /** + * send broadcast to stop other application, such as music, MATV, + * FMTransmitter + */ + private void sendBroadcastToStopOtherAPP() { + Intent intentToMusic = new Intent(ACTION_TOMUSICSERVICE_POWERDOWN); + sendBroadcast(intentToMusic); + Intent intentToAtv = new Intent(ACTION_TOATVSERVICE_POWERDOWN); + sendBroadcast(intentToAtv); + Intent intentToFMTx = new Intent(ACTION_TOFMTXSERVICE_POWERDOWN); + sendBroadcast(intentToFMTx); + } + + /** + * power down FM + */ + public void powerDownAsync() { + // if power down Fm, should remove message first. + // not remove all messages, because such as recorder message need + // to execute after or before power down + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_POWERDOWN_FINISHED); + } + + /** + * Power down FM + * + * @return true if power down success + */ + private boolean powerDown() { + Log.d(TAG, ">>> FmRadioService.powerDown"); + if (!mIsPowerUp) { + Log.w(TAG, "Error: device is already power down."); + return true; + } + + setMute(true); + setRds(false); + enableFmAudio(false); + + // Only need to power down if RX status in native is ON + // If TX is on, so need power down(TX is using). + boolean isRxOn = FmRadioNative.getFmStatus(CURRENT_RX_ON); + boolean powerDownSuccess = false; + if (isRxOn) { + powerDownSuccess = FmRadioNative.powerDown(0); + } else { + powerDownSuccess = true; + } + + if (!powerDownSuccess) { + Log.e(TAG, "Error: powerdown failed."); + // activity used for update powerdown menu + mIsMakePowerDown = true; + + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + mIsPowerUp = false; + if (mWakeLock.isHeld()) { + mWakeLock.release(); + Log.d(TAG, "release wake lock"); + } + // Remove the notification in the title bar. + removeNotification(); + Log.d(TAG, "powerdown failed.release some resource."); + return false; + } + // activity used for update powerdown menu + mIsMakePowerDown = true; + + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + mIsPowerUp = false; + + if (mWakeLock.isHeld()) { + mWakeLock.release(); + Log.d(TAG, "release wake lock"); + } + + // Remove the notification in the title bar. + removeNotification(); + Log.d(TAG, "<<< FmRadioService.powerDown: true"); + return true; + } + + /** + * Check whether FM is power up + * + * @return true, power up; false, power down. + */ + public boolean isPowerUp() { + Log.d(TAG, "FmRadioService.isPowerUp: " + mIsPowerUp); + return mIsPowerUp; + } + + /** + * Check whether FM is power uping. if power uping, activity should call + * super.onBackPressed, avoid not execute power down method. + * + * @return true, power up; false, power down. + */ + public boolean isPowerUping() { + Log.d(TAG, "FmRadioService.isPowerUping: " + mIsPowerUping); + return mIsPowerUping; + } + + /** + * Check whether FM is power down by other app. + * + * @return true, power down; true. + */ + public boolean isMakePowerDown() { + Log.d(TAG, "FmRadioService.mIsMakePowerDown: " + mIsMakePowerDown); + return mIsMakePowerDown; + } + + /** + * Tune to a station + * + * @param frequency The frequency to tune + * + * @return true, success; false, fail. + */ + public void tuneStationAsync(float frequency) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_TUNE_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private boolean tuneStation(float frequency) { + Log.d(TAG, ">>> FmRadioService.tune: " + frequency); + if (mIsPowerUp) { + setRds(false); + Log.d(TAG, "FmRadioService.native tune start"); + boolean bRet = FmRadioNative.tune(frequency); + Log.d(TAG, "FmRadioService.native tune end"); + if (bRet) { + setRds(true); + mCurrentStation = FmRadioUtils.computeStation(frequency); + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + updateNotification(); + } + setMute(false); + Log.d(TAG, "<<< FmRadioService.tune: " + bRet); + return bRet; + } + + // if not support short Antenna and earphone is not insert, not power up + if (!isAntennaAvailable() && !SHORT_ANNTENNA_SUPPORT) { + Log.d(TAG, "earphone is not insert and short antenna not support"); + return false; + } + + // if not power up yet, should powerup first + Log.w(TAG, "FM is not powered up"); + mIsPowerUping = true; + boolean tune = false; + + if (powerUpFm(frequency)) { + tune = startPlayFm(frequency); + } + mIsPowerUping = false; + Log.d(TAG, "<<< FmRadioService.tune: mIsPowerup:" + tune); + return tune; + } + + /** + * Seek station according frequency and direction + * + * @param frequency start frequency(100KHZ, 87.5) + * @param isUp direction(true, next station; false, previous station) + * + * @return the frequency after seek + */ + public void seekStationAsync(float frequency, boolean isUp) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + final int bundleSize = 2; + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + bundle.putBoolean(OPTION, isUp); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SEEK_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private float seekStation(float frequency, boolean isUp) { + Log.d(TAG, ">>> FmRadioService.seek: " + frequency + " " + isUp); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + + setRds(false); + mIsNativeSeeking = true; + float fRet = FmRadioNative.seek(frequency, isUp); + mIsNativeSeeking = false; + // make mIsStopScanCalled false, avoid stop scan make this true, + // when start scan, it will return null. + mIsStopScanCalled = false; + Log.d(TAG, "<<< FmRadioService.seek: " + fRet); + return fRet; + } + + /** + * Scan stations + */ + public void startScanAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_SCAN_FINISHED); + } + + private int[] startScan() { + Log.d(TAG, ">>> FmRadioService.startScan"); + int[] iChannels = null; + + setRds(false); + setMute(true); + short[] shortChannels = null; + if (!mIsStopScanCalled) { + mIsNativeScanning = true; + Log.d(TAG, "startScan native method:start"); + shortChannels = FmRadioNative.autoScan(); + Log.d(TAG, "startScan native method:end " + Arrays.toString(shortChannels)); + mIsNativeScanning = false; + } + + setRds(true); + if (mIsStopScanCalled) { + // Received a message to power down FM, or interrupted by a phone + // call. Do not return any stations. shortChannels = null; + // if cancel scan, return invalid station -100 + shortChannels = new short[] { + -100 + }; + mIsStopScanCalled = false; + } + + if (null != shortChannels) { + int size = shortChannels.length; + iChannels = new int[size]; + for (int i = 0; i < size; i++) { + iChannels[i] = shortChannels[i]; + } + } + Log.d(TAG, "<<< FmRadioService.startScan: " + Arrays.toString(iChannels)); + return iChannels; + } + + /** + * Check FM Radio is in scan progress or not + * + * @return if in scan progress return true, otherwise return false. + */ + public boolean isScanning() { + return mIsScanning; + } + + /** + * Stop scan progress + * + * @return true if can stop scan, otherwise return false. + */ + public boolean stopScan() { + Log.d(TAG, ">>> FmRadioService.stopScan"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return false; + } + + boolean bRet = false; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + if (mIsNativeScanning || mIsNativeSeeking) { + mIsStopScanCalled = true; + Log.d(TAG, "native stop scan:start"); + bRet = FmRadioNative.stopScan(); + Log.d(TAG, "native stop scan:end --" + bRet); + } + Log.d(TAG, "<<< FmRadioService.stopScan: " + bRet); + return bRet; + } + + /** + * Check FM is in seek progress or not + * + * @return true if in seek progress, otherwise return false. + */ + public boolean isSeeking() { + return mIsNativeSeeking; + } + + /** + * Set RDS + * + * @param on true, enable RDS; false, disable RDS. + */ + public void setRdsAsync(boolean on) { + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_RDS_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, on); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_RDS_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private int setRds(boolean on) { + if (!mIsPowerUp) { + return -1; + } + Log.d(TAG, ">>> FmRadioService.setRDS: " + on); + int ret = -1; + if (isRdsSupported()) { + ret = FmRadioNative.setRds(on); + } + setPS(""); + setLRText(""); + Log.d(TAG, "<<< FmRadioService.setRDS: " + ret); + return ret; + } + + /** + * Get PS information + * + * @return PS information + */ + public String getPS() { + Log.d(TAG, "FmRadioService.getPS: " + mPSString); + return mPSString; + } + + /** + * Get RT information + * + * @return RT information + */ + public String getLRText() { + Log.d(TAG, "FmRadioService.getLRText: " + mLRTextString); + return mLRTextString; + } + + /** + * Get AF frequency + * + * @return AF frequency + */ + public void activeAFAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_ACTIVE_AF_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_ACTIVE_AF_FINISHED); + } + + private int activeAF() { + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + + int frequency = FmRadioNative.activeAf(); + Log.d(TAG, "FmRadioService.activeAF: " + frequency); + return frequency; + } + + /** + * Mute or unmute FM voice + * + * @param mute true for mute, false for unmute + * + * @return (true, success; false, failed) + */ + public void setMuteAsync(boolean mute) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_MUTE_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, mute); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_MUTE_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private int setMute(boolean mute) { + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + Log.d(TAG, ">>> FmRadioService.setMute: " + mute); + int iRet = FmRadioNative.setMute(mute); + Log.d(TAG, "<<< FmRadioService.setMute: " + iRet); + return iRet; + } + + /** + * Check whether RDS is support in driver + * + * @return (true, support; false, not support) + */ + public boolean isRdsSupported() { + boolean isRdsSupported = (FmRadioNative.isRdsSupport() == 1); + Log.d(TAG, "FmRadioService.isRdsSupported: " + isRdsSupported); + return isRdsSupported; + } + + /** + * Check whether speaker used or not + * + * @return true if use speaker, otherwise return false + */ + public boolean isSpeakerUsed() { + Log.d(TAG, "FmRadioService.isSpeakerUsed: " + mIsSpeakerUsed); + return mIsSpeakerUsed; + } + + /** + * Initial service and current station + * + * @param iCurrentStation current station frequency + */ + public void initService(int iCurrentStation) { + Log.d(TAG, "FmRadioService.initService: " + iCurrentStation); + mIsServiceInited = true; + mCurrentStation = iCurrentStation; + } + + /** + * Check service is initialed or not + * + * @return true if initialed, otherwise return false + */ + public boolean isServiceInited() { + Log.d(TAG, "FmRadioService.isServiceInit: " + mIsServiceInited); + return mIsServiceInited; + } + + /** + * Get FM service current station frequency + * + * @return Current station frequency + */ + public int getFrequency() { + Log.d(TAG, "FmRadioService.getFrequency: " + mCurrentStation); + return mCurrentStation; + } + + /** + * Set FM service station frequency + * + * @param station Current station + */ + public void setFrequency(int station) { + mCurrentStation = station; + } + + /** + * resume FM audio + */ + private void resumeFmAudio() { + Log.d(TAG, "FmRadioService.resumeFmAudio"); + // If not check mIsAudioFocusHeld && mIsPowerup, when scan canceled, + // this will be resume first, then execute power down. it will cause + // nosise. + if (mIsAudioFocusHeld && mIsPowerUp) { + enableFmAudio(true); + } + } + + /** + * Switch antenna There are two types of antenna(long and short) If long + * antenna(most is this type), must plug in earphone as antenna to receive + * FM. If short antenna, means there is a short antenna if phone already, + * can receive FM without earphone. + * + * @param antenna antenna (0, long antenna, 1 short antenna) + * + * @return (0, success; 1 failed; 2 not support) + */ + public void switchAntennaAsync(int antenna) { + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SWITCH_ANNTENNA); + + Bundle bundle = new Bundle(bundleSize); + bundle.putInt(FmRadioListener.SWITCH_ANNTENNA_VALUE, antenna); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SWITCH_ANNTENNA); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + /** + * Need native support whether antenna support interface. + * + * @param antenna antenna (0, long antenna, 1 short antenna) + * + * @return (0, success; 1 failed; 2 not support) + */ + private int switchAntenna(int antenna) { + Log.d(TAG, ">>> FmRadioService.switchAntenna:" + antenna); + // if fm not powerup, switchAntenna will flag whether has earphone + int ret = FmRadioNative.switchAntenna(antenna); + Log.d(TAG, "<<< FmRadioService.switchAntenna: " + ret); + return ret; + } + + /** + * Start recording + */ + public void startRecordingAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTRECORDING_FINISHED); + } + + private void startRecording() { + Log.d(TAG, ">>> startRecording"); + if (!mIsPowerUp) { + Log.d(TAG, "native is not power up: " + mIsPowerUp); + onRecorderError(FmRecorder.ERROR_RECORDER_INVALID_STATE); + return; + } + sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + Log.d(TAG, "default sd card file path: " + sRecordingSdcard); + if (sRecordingSdcard == null || sRecordingSdcard.isEmpty()) { + Log.d(TAG, "startRecording: may be no sdcard"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + return; + } + + if (mFmRecorder == null) { + mFmRecorder = new FmRecorder(); + mFmRecorder.registerRecorderStateListener(FmRadioService.this); + } + + if (isSdcardReady(sRecordingSdcard)) { + mFmRecorder.startRecording(getApplicationContext()); + } else { + Log.d(TAG, "Cannot record because sdcard is not ready!!"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + } + Log.d(TAG, "<<< startRecording"); + } + + private boolean isSdcardReady(String sdcardPath) { + Log.d(TAG, ">>> isSdcardReady: sdcardPath is " + sdcardPath + + ", mSdcardStateMap is " + mSdcardStateMap); + if (!mSdcardStateMap.isEmpty()) { + if (mSdcardStateMap.get(sdcardPath) != null && !mSdcardStateMap.get(sdcardPath)) { + Log.d(TAG, "<<< isSdcardReady: return false"); + return false; + } + } + Log.d(TAG, "<<< isSdcardReady: mSdcardStateMap:" + mSdcardStateMap); + return true; + } + + /** + * stop recording + */ + public void stopRecordingAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPRECORDING_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPRECORDING_FINISHED); + } + + private boolean stopRecording() { + Log.d(TAG, ">>> stopRecording"); + if (mFmRecorder == null) { + Log.e(TAG, "stopRecording called without a valid recorder!!"); + return false; + } + synchronized (mStopRecordingLock) { + mFmRecorder.stopRecording(); + Log.d(TAG, "<<< stopRecording"); + } + return true; + } + + /** + * Start play recording file + */ + public void startPlaybackAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + } + + private boolean startPlayback() { + Log.d(TAG, ">>> startPlayback"); + if (!requestAudioFocus()) { + Log.d(TAG, "can't get audio focus when play recording file"); + return false; + } + + if (mFmRecorder == null) { + Log.e(TAG, "FMRecorder is null !!"); + return false; + } + + // Set Mute before start playback + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + enableFmAudio(false); + + mFmRecorder.startPlayback(); + Log.d(TAG, "<<< startPlayback"); + return true; + } + + /** + * stop play recording file + */ + public void stopPlaybackAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + } + + private void stopPlayback() { + Log.d(TAG, ">>> stopPlayback"); + if (mFmRecorder != null) { + mFmRecorder.stopPlayback(); + checkAfterPlayback(); + } + Log.d(TAG, "<<< stopPlayback"); + } + + /** + * Save recording file according name or discard recording file if name is + * null + * + * @param newName New recording file name + */ + public void saveRecordingAsync(String newName) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SAVERECORDING_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putString(RECODING_FILE_NAME, newName); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SAVERECORDING_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private void saveRecording(String newName) { + Log.d(TAG, ">>> saveRecording"); + if (mFmRecorder != null) { + if (newName != null) { + mFmRecorder.saveRecording(FmRadioService.this, newName); + Log.d(TAG, "<<< saveRecording"); + return; + } + mFmRecorder.discardRecording(); + } + Log.d(TAG, "<<< saveRecording"); + } + + /** + * Get record time + * + * @return Record time + */ + public long getRecordTime() { + if (mFmRecorder != null) { + return mFmRecorder.recordTime(); + } + Log.e(TAG, "FMRecorder is null !!"); + return 0; + } + + /** + * Set recording mode + * + * @param isRecording true, enter recoding mode; false, exit recording mode + */ + public void setRecordingModeAsync(boolean isRecording) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_RECORD_MODE_CHANED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, isRecording); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_RECORD_MODE_CHANED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private void setRecordingMode(boolean isRecording) { + Log.d(TAG, ">>> setRecordingMode: isRecording=" + isRecording); + mIsInRecordingMode = isRecording; + if (mFmRecorder != null) { + if (!isRecording) { + if (mFmRecorder.getState() != FmRecorder.STATE_IDLE) { + mFmRecorder.stopRecording(); + mFmRecorder.stopPlayback(); + } + resumeFmAudio(); + setMute(false); + Log.d(TAG, "<<< setRecordingMode"); + return; + } + // reset recorder to unused status + mFmRecorder.resetRecorder(); + } + Log.d(TAG, "<<< setRecordingMode"); + } + + /** + * Get current recording mode + * + * @return if in recording mode return true, otherwise return false; + */ + public boolean getRecordingMode() { + return mIsInRecordingMode; + } + + /** + * Get record state + * + * @return record state + */ + public int getRecorderState() { + if (null != mFmRecorder) { + return mFmRecorder.getState(); + } + return FmRecorder.STATE_INVALID; + } + + /** + * Get recording file name + * + * @return recording file name + */ + public String getRecordingName() { + if (null != mFmRecorder) { + return mFmRecorder.getRecordingName(); + } + return null; + } + + /** + * Get current recording file name with full path + * + * @return The current recording file name or null + */ + public String getRecordingNameWithPath() { + if (null != mFmRecorder) { + return mFmRecorder.getRecordingNameWithPath(); + } + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + Log.d(TAG, ">>> FmRadioService.onCreate"); + Log.d(TAG, "short antenna support:" + SHORT_ANNTENNA_SUPPORT); + mContext = getApplicationContext(); + mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); + mWakeLock.setReferenceCounted(false); + sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + + if (!initFmPlayer()) { + Log.e(TAG, "init FMPlayer failed"); + return; + } + + registerFmBroadcastReceiver(); + registerSdcardReceiver(); + + HandlerThread handlerThread = new HandlerThread("FmRadioServiceThread"); + handlerThread.start(); + mFmServiceHandler = new FmRadioServiceHandler(handlerThread.getLooper()); + + openDevice(); + // set speaker to default status, avoid setting->clear data. + setSpeakerPhoneOn(mIsSpeakerUsed); + Log.d(TAG, "<<< FmRadioService.onCreate"); + } + + private boolean initFmPlayer() { + mFmPlayer = new MediaPlayer(); + if (!FmRadioUtils.isFmSuspendSupport()) { + mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK); + } + mFmPlayer.setOnErrorListener(mPlayerErrorListener); + try { + mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + } catch (IOException ex) { + // notify the user why the file couldn't be opened + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalArgumentException ex) { + // notify the user why the file couldn't be opened + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (SecurityException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } + mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + return true; + } + + private void registerFmBroadcastReceiver() { + IntentFilter filter = new IntentFilter(); + filter.addAction(SOUND_POWER_DOWN_MSG); + filter.addAction(Intent.ACTION_SHUTDOWN); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_HEADSET_PLUG); +/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:22:01 +0800 + */ + //if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION) { + // filter.addAction("com.mediatek.FMRadio.FMRadioService.NEXT_STATION"); + //} +// End of Vanzo:tanglei + filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); + filter.addAction(ACTION_TOFMSERVICE_POWERDOWN); + filter.addAction(ACTION_FROMATVSERVICE_POWERUP); + mBroadcastReceiver = new FmServiceBroadcastReceiver(); + Log.i(TAG, "Register broadcast receiver."); + registerReceiver(mBroadcastReceiver, filter); + } + + private void unregisterFmBroadcastReceiver() { + if (null != mBroadcastReceiver) { + Log.i(TAG, "Unregister broadcast receiver."); + unregisterReceiver(mBroadcastReceiver); + mBroadcastReceiver = null; + } + } + + @Override + public void onDestroy() { + Log.d(TAG, ">>> FmRadioService.onDestroy"); + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + // stop rds first, avoid blocking other native method + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + unregisterFmBroadcastReceiver(); + unregisterSdcardListener(); + abandonAudioFocus(); + exitFm(); + if (null != mFmRecorder) { + mFmRecorder = null; + } + super.onDestroy(); + } + + /** + * Exit FMRadio application + */ + private void exitFm() { + Log.d(TAG, "service.exitFm start"); + mIsAudioFocusHeld = false; + // Stop FM recorder if it is working + if (null != mFmRecorder) { + synchronized (mStopRecordingLock) { + int fmState = mFmRecorder.getState(); + if (FmRecorder.STATE_PLAYBACK == fmState) { + mFmRecorder.stopPlayback(); + Log.d(TAG, "Stop playback FMRecorder."); + } else if (FmRecorder.STATE_RECORDING == fmState) { + mFmRecorder.stopRecording(); + Log.d(TAG, "stop Recording."); + } + + // ALPS01789667 Add to DB if exit, there are two cases: + // case 1: FileManager play Music->FM receive short audio focus->Fm stop recording + // -> FM receive SOUND_POWER_DOWN_MSG->Come here but is IDLE status + // case 2: Music play a song->FM receive long audio focus->Come here is RECORDING + mFmRecorder.addCurrentRecordingToDb(mContext); + } + } + + // When exit, we set the audio path back to earphone. + if (mIsNativeScanning || mIsNativeSeeking) { + stopScan(); + } + + mFmServiceHandler.removeCallbacksAndMessages(null); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_FM_EXIT); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_FM_EXIT); + Log.d(TAG, "service.exitFm end"); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Change the notification string. + if (mIsPowerUp) { + showNotification(); + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d(TAG, ">>> FmRadioService.onStartCommand intent: " + intent + " startId: " + startId); + int ret = super.onStartCommand(intent, flags, startId); + Log.d(TAG, "<<< FmRadioService.onStartCommand: " + ret); + return START_NOT_STICKY; + } + + /** + * Start RDS thread to update RDS information + */ + private void startRdsThread() { + Log.d(TAG, ">>> FmRadioService.startRdSThread"); + mIsRdsThreadExit = false; + if (null != mRdsThread) { + return; + } + mRdsThread = new Thread() { + public void run() { + Log.d(TAG, ">>> RDS Thread run()"); + while (true) { + if (mIsRdsThreadExit) { + break; + } + + int iRdsEvents = FmRadioNative.readRds(); + if (iRdsEvents != 0) { + Log.d(TAG, "FmRadioNative.readrds events: " + iRdsEvents); + } + + if (RDS_EVENT_PROGRAMNAME == (RDS_EVENT_PROGRAMNAME & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_PROGRAMNAME"); + byte[] bytePS = FmRadioNative.getPs(); + if (null != bytePS) { + setPS(new String(bytePS).trim()); + } + } + + if (RDS_EVENT_LAST_RADIOTEXT == (RDS_EVENT_LAST_RADIOTEXT & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_LAST_RADIOTEXT"); + byte[] byteLRText = FmRadioNative.getLrText(); + if (null != byteLRText) { + setLRText(new String(byteLRText).trim()); + } + } + + if (RDS_EVENT_AF == (RDS_EVENT_AF & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_AF"); + /* + * add for rds AF + */ + if (mIsScanning || mIsSeeking) { + Log.d(TAG, "RDSThread. seek or scan going, no need to tune here"); + } else if (!mIsPowerUp) { + Log.d(TAG, "RDSThread. fm is power down, do nothing."); + } else { + int iFreq = FmRadioNative.activeAf(); + if (FmRadioUtils.isValidStation(iFreq)) { + // if the new frequency is not equal to current + // frequency. + if (mCurrentStation == iFreq) { + Log.w(TAG, "RDSThread. the new freq is the same as current."); + } else { + setPS(""); + setLRText(""); + if (!mIsScanning && !mIsSeeking) { + Log.d(TAG, "RDSThread. seek or scan not going," + + "need to tune here"); + tuneStationAsync(FmRadioUtils.computeFrequency(iFreq)); + } + } + } + } + } + // Do not handle other events. + // Sleep 500ms to reduce inquiry frequency + try { + final int hundredMillisecond = 500; + Thread.sleep(hundredMillisecond); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "<<< RDS Thread run()"); + } + }; + + Log.d(TAG, "Start RDS Thread."); + mRdsThread.start(); + Log.d(TAG, "<<< FmRadioService.startRdSThread"); + } + + /** + * Stop RDS thread to stop listen station RDS change + */ + private void stopRdsThread() { + Log.d(TAG, ">>> FmRadioService.stopRdSThread"); + if (null != mRdsThread) { + // Must call closedev after stopRDSThread. + mIsRdsThreadExit = true; + mRdsThread = null; + } + Log.d(TAG, "<<< FmRadioService.stopRdSThread"); + } + + /** + * Set PS information + * + * @param ps The ps information + */ + private void setPS(String ps) { + Log.d(TAG, "FmRadioService.setPS: " + ps + " ,current: " + mPSString); + if (0 != mPSString.compareTo(ps)) { + mPSString = ps; + Bundle bundle = new Bundle(3); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_PS_CHANGED); + bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString); + bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString); + notifyActivityStateChanged(bundle); + } // else New PS is the same as current + } + + /** + * Set RT information + * + * @param lrtText The RT information + */ + private void setLRText(String lrtText) { + Log.d(TAG, "FmRadioService.setLRText: " + lrtText + " ,current: " + mLRTextString); + if (0 != mLRTextString.compareTo(lrtText)) { + mLRTextString = lrtText; + Bundle bundle = new Bundle(3); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RT_CHANGED); + bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString); + bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString); + notifyActivityStateChanged(bundle); + } // else New RT is the same as current + } + + /** + * Open or close FM Radio audio + * + * @param enable true, open FM audio; false, close FM audio; + */ + private void enableFmAudio(boolean enable) { + Log.d(TAG, ">>> FmRadioService.enableFmAudio: " + enable); + if ((mFmPlayer == null) || !mIsPowerUp) { + Log.w(TAG, "mFMPlayer is null in Service.enableFmAudio"); + return; + } + + try { + if (!enable) { + if (!mFmPlayer.isPlaying()) { + Log.d(TAG, "warning: FM audio is already disabled."); + return; + } + + Log.d(TAG, "call MediaPlayer.stop()"); + mFmPlayer.stop(); + Log.d(TAG, "stop FM audio."); + return; + } + + if (mFmPlayer.isPlaying()) { + Log.d(TAG, "warning: FM audio is already enabled."); + return; + } + } catch (IllegalStateException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer isPlaying.", e); + } + + try { + mFmPlayer.prepare(); + //if (FmRadioUtils.isFmSuspendSupport()) { + // Log.d(TAG, "support FM suspend"); + // mFmPlayer.startWithoutWakelock(); + //} else { + mFmPlayer.start(); + //} + } catch (IOException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e); + } catch (IllegalStateException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e); + } + + Log.d(TAG, "Start FM audio."); + Log.d(TAG, "<<< FmRadioService.enableFmAudio"); + } + + /** + * Show notification + */ + private void showNotification() { + Log.d(TAG, "FmRadioService.showNotification"); + Intent notificationIntent = new Intent(); + notificationIntent.setClassName(getPackageName(), FmRadioActivity.class.getName()); + PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), + 0, notificationIntent, 0); + Notification notification = new Notification(R.drawable.fm_title_icon, null, + System.currentTimeMillis()); + notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; + String fmUnit = mContext.getString(R.string.fm_unit); + String text = FmRadioUtils.formatStation(mCurrentStation) + " " + fmUnit; + notification.setLatestEventInfo(getApplicationContext(), + getResources().getString(R.string.app_name), text, pendingIntent); + Log.d(TAG, "Add notification to the title bar."); + startForeground(NOTIFICATION_ID, notification); + } + + /** + * Remove notification + */ + private void removeNotification() { + Log.d(TAG, "FmRadioService.removeNotification"); + stopForeground(true); + } + + /** + * Update notification + */ + private void updateNotification() { + Log.d(TAG, "FmRadioService.updateNotification"); + if (mIsPowerUp) { + showNotification(); + } + } + + /** + * Register sdcard listener for record + */ + private void registerSdcardReceiver() { + Log.v(TAG, "registerSdcardReceiver >>> "); + if (mSdcardListener == null) { + mSdcardListener = new SdcardListener(); + } + IntentFilter filter = new IntentFilter(); + filter.addDataScheme("file"); + filter.addAction(Intent.ACTION_MEDIA_MOUNTED); + filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); + filter.addAction(Intent.ACTION_MEDIA_EJECT); + registerReceiver(mSdcardListener, filter); + Log.v(TAG, "registerSdcardReceiver <<< "); + } + + private void unregisterSdcardListener() { + if (null != mSdcardListener) { + unregisterReceiver(mSdcardListener); + } + } + + private void updateSdcardStateMap(Intent intent) { + String action = intent.getAction(); + String sdcardPath = null; + Uri mountPointUri = intent.getData(); + if (mountPointUri != null) { + sdcardPath = mountPointUri.getPath(); + if (sdcardPath != null) { + if (Intent.ACTION_MEDIA_EJECT.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: ENJECT " + sdcardPath); + mSdcardStateMap.put(sdcardPath, false); + } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: UNMOUNTED " + sdcardPath); + mSdcardStateMap.put(sdcardPath, false); + } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: MOUNTED " + sdcardPath); + mSdcardStateMap.put(sdcardPath, true); + } + } + } + } + + /** + * Notify FM recorder state + * + * @param state The current FM recorder state + */ + @Override + public void onRecorderStateChanged(int state) { + Log.d(TAG, "onRecorderStateChanged: " + state); + mRecordState = state; + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDSTATE_CHANGED); + bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, state); + notifyActivityStateChanged(bundle); + } + + /** + * Notify FM recorder error message + * + * @param error The recorder error type + */ + @Override + public void onRecorderError(int error) { + Log.d(TAG, "onRecorderError: " + error); + // if media server die, will not enable FM audio, and convert to + // ERROR_PLAYER_INATERNAL, call back to activity showing toast. + mRecorderErrorType = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == error) ? + FmRecorder.ERROR_PLAYER_INTERNAL : error; + + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDERROR); + bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, mRecorderErrorType); + notifyActivityStateChanged(bundle); + + // if media server die, should not enable fm, otherwise je will occur. + if (FmRecorder.ERROR_PLAYER_INTERNAL == error) { + resumeFmAudio(); + } + } + + /** + * Notify play FM record file complete + */ + @Override + public void onPlayRecordFileComplete() { + Log.d(TAG, "service.onPlayRecordFileComplete"); + checkAfterPlayback(); + } + + /** + * Check and go next(play or show tips) after recorder file play + * back finish. + * Two cases: + * 1. With headset or support short antenna -> play FM + * 2. Without headset -> show plug in earphone tips + */ + private void checkAfterPlayback() { + if (isHeadSetIn() || SHORT_ANNTENNA_SUPPORT) { + // with headset + Log.d(TAG, "checkAfterPlayback:eaphone is in,need resume fm"); + if (mIsPowerUp) { + resumeFmAudio(); + setMute(false); + } else { + powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + } + } else { + // without headset need show plug in earphone tips + Log.d(TAG, "checkAfterPlayback:earphone is out, need show plug in earphone tips"); + switchAntennaAsync(mValueHeadSetPlug); + } + } + + /** + * Check the headset is plug in or plug out + * + * @return true for plug in; false for plug out + */ + private boolean isHeadSetIn() { + return (0 == mValueHeadSetPlug); + } + + private void stopFmFocusLoss(int focusState) { + mIsAudioFocusHeld = false; + if (mIsNativeScanning || mIsNativeSeeking) { + // make stop scan from activity call to service. + // notifyActivityStateChanged(FMRadioListener.LISTEN_SCAN_CANCELED); + stopScan(); + Log.d(TAG, "need to stop FM, so stop scan channel."); + } + + // using handler thread to update audio focus state + updateAudioFocusAync(focusState); + Log.d(TAG, "need to stop FM, so powerdown FM."); + + } + + /** + * Handle FM Player error + */ + private final MediaPlayer.OnErrorListener mPlayerErrorListener = + new MediaPlayer.OnErrorListener() { + /** + * handle error message + * + * @param mp occurred error media player + * @param what error message + * @param extra error message extra + * + * @return handle error message or not + */ + public boolean onError(MediaPlayer mp, int what, int extra) { + + if (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) { + Log.d(TAG, "onError: MEDIA_SERVER_DIED"); + if (null != mFmPlayer) { + mFmPlayer.release(); + mFmPlayer = null; + } + mFmPlayer = new MediaPlayer(); + if (!FmRadioUtils.isFmSuspendSupport()) { + mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK); + } + mFmPlayer.setOnErrorListener(mPlayerErrorListener); + try { + mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + if (mIsPowerUp) { + // set speaker mode according to AP + setSpeakerPhoneOn(mIsSpeakerUsed); + mFmPlayer.prepare(); + //if (FmRadioUtils.isFmSuspendSupport()) { + // Log.d(TAG, "support FM suspend"); + // mFmPlayer.startWithoutWakelock(); + //} else { + mFmPlayer.start(); + //} + } + } catch (IOException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalArgumentException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } + } + + return true; + } + }; + + /** + * Request audio focus + * + * @return true, success; false, fail; + */ + public boolean requestAudioFocus() { + if (mIsAudioFocusHeld) { + return true; + } + + int audioFocus = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, + AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + mIsAudioFocusHeld = (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioFocus); + return mIsAudioFocusHeld; + } + + /** + * Abandon audio focus + */ + public void abandonAudioFocus() { + mAudioManager.abandonAudioFocus(mAudioFocusChangeListener); + mIsAudioFocusHeld = false; + } + + /** + * Use to interact with other voice related app + */ + private final OnAudioFocusChangeListener mAudioFocusChangeListener = + new OnAudioFocusChangeListener() { + /** + * Handle audio focus change ensure message FIFO + * + * @param focusChange audio focus change state + */ + @Override + public void onAudioFocusChange(int focusChange) { + Log.d(TAG, "onAudioFocusChange: " + focusChange); + switch (focusChange) { + case AudioManager.AUDIOFOCUS_LOSS: + synchronized (this) { + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS"); + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + Log.d(TAG, "onAudioFocusChange.setParameters end"); + exitFm(); + stopSelf(); + } + break; + + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + synchronized (this) { + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT"); + stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); + } + break; + + case AudioManager.AUDIOFOCUS_GAIN: + synchronized (this) { + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_GAIN"); + updateAudioFocusAync(AudioManager.AUDIOFOCUS_GAIN); + } + break; + + default: + Log.d(TAG, "AudioFocus: Audio focus change, but not need handle"); + break; + } + } + }; + + /** + * Audio focus changed, will send message to handler thread. synchronized to + * ensure one message can go in this method. + * + * @param focusState AudioManager state + */ + private synchronized void updateAudioFocusAync(int focusState) { + Log.d(TAG, "updateAudioFocusAync: focusState = " + focusState); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED, focusState); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_AUDIOFOCUS_CHANGED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + /** + * Audio focus changed, update FM focus state. + * + * @param focusState AudioManager state + */ + private void updateAudioFocus(int focusState) { + Log.d(TAG, "FmRadioService.updateAudioFocus"); + switch (focusState) { + case AudioManager.AUDIOFOCUS_LOSS: + mPausedByTransientLossOfFocus = false; + // play back audio will output with music audio + // May be affect other recorder app, but the flow can not be + // execute earlier, + // It should ensure execute after start/stop record. + if (mFmRecorder != null) { + int fmState = mFmRecorder.getState(); + Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState); + // only handle recorder state, not handle playback state + if (fmState == FmRecorder.STATE_RECORDING) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPRECORDING_FINISHED); + stopRecording(); + } + } + handlePowerDown(); + break; + + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + if (mIsPowerUp) { + mPausedByTransientLossOfFocus = true; + } + Log.d(TAG, "AUDIOFOCUS_LOSS_TRANSIENT: mPausedByTransientLossOfFocus:" + + mPausedByTransientLossOfFocus); + // play back audio will output with music audio + // May be affect other recorder app, but the flow can not be + // execute earlier, + // It should ensure execute after start/stop record. + if (mFmRecorder != null) { + int fmState = mFmRecorder.getState(); + Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState); + if (fmState == FmRecorder.STATE_RECORDING) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPRECORDING_FINISHED); + stopRecording(); + } + if (fmState == FmRecorder.STATE_PLAYBACK) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + stopPlayback(); + } + } + handlePowerDown(); + break; + + case AudioManager.AUDIOFOCUS_GAIN: + Log.d(TAG, "AUDIOFOCUS_GAIN: mPausedByTransientLossOfFocus:" + + mPausedByTransientLossOfFocus); + if (!mIsPowerUp && mPausedByTransientLossOfFocus) { + mIsPowerUping = true; + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, FmRadioUtils.computeFrequency(mCurrentStation)); + handlePowerUp(bundle); + } + break; + + default: + break; + } + } + + /** + * FM Radio listener record + */ + private static class Record { + int mHashCode; // hash code + FmRadioListener mCallback; // call back + } + + /** + * Register FM Radio listener, activity get service state should call this + * method register FM Radio listener + * + * @param callback FM Radio listener + */ + public void registerFmRadioListener(FmRadioListener callback) { + synchronized (mRecords) { + // register callback in AudioProfileService, if the callback is + // exist, just replace the event. + Record record = null; + int hashCode = callback.hashCode(); + final int n = mRecords.size(); + for (int i = 0; i < n; i++) { + record = mRecords.get(i); + if (hashCode == record.mHashCode) { + return; + } + } + record = new Record(); + record.mHashCode = hashCode; + record.mCallback = callback; + mRecords.add(record); + } + } + + /** + * Call back from service to activity + * + * @param bundle The message to activity + */ + private void notifyActivityStateChanged(Bundle bundle) { + if (!mRecords.isEmpty()) { + Log.d(TAG, "notifyActivityStatusChanged:clients = " + mRecords.size()); + synchronized (mRecords) { + Iterator<Record> iterator = mRecords.iterator(); + while (iterator.hasNext()) { + Record record = (Record) iterator.next(); + + FmRadioListener listener = record.mCallback; + + if (listener == null) { + iterator.remove(); + return; + } + + listener.onCallBack(bundle); + } + } + } + } + + /** + * Unregister FM Radio listener + * + * @param callback FM Radio listener + */ + public void unregisterFmRadioListener(FmRadioListener callback) { + remove(callback.hashCode()); + } + + /** + * Remove call back according hash code + * + * @param hashCode The call back hash code + */ + private void remove(int hashCode) { + synchronized (mRecords) { + Iterator<Record> iterator = mRecords.iterator(); + while (iterator.hasNext()) { + Record record = (Record) iterator.next(); + if (record.mHashCode == hashCode) { + iterator.remove(); + } + } + } + } + + /** + * Check recording sd card is unmount + * + * @param intent The unmount sd card intent + * + * @return true or false indicate whether current recording sd card is + * unmount or not + */ + public boolean isRecordingCardUnmount(Intent intent) { + String unmountSDCard = intent.getData().toString(); + Log.d(TAG, "unmount sd card file path: " + unmountSDCard); + return unmountSDCard.equalsIgnoreCase("file://" + sRecordingSdcard) ? true : false; + } + + private int[] insertSearchedStation(int[] channels) { + Log.d(TAG, "insertSearchedStation.firstValidChannel:" + Arrays.toString(channels)); + int firstValidChannel = mCurrentStation; + int channelNum = 0; + if (null != channels) { + Arrays.sort(channels); + int size = channels.length; + // Save searched stations into database by batch + ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); + String defaultStationName = getString(R.string.default_station_name); + for (int i = 0; i < size; i++) { + if (FmRadioUtils.isValidStation(channels[i])) { + if (0 == channelNum) { + firstValidChannel = channels[i]; + } + + if (!FmRadioStation.isFavoriteStation(mContext, channels[i])) { + ops.add(ContentProviderOperation.newInsert(Station.CONTENT_URI) + .withValue(Station.COLUMN_STATION_NAME, defaultStationName) + .withValue(Station.COLUMN_STATION_FREQ, channels[i]) + .withValue(Station.COLUMN_STATION_TYPE, + FmRadioStation.STATION_TYPE_SEARCHED) + .build()); + } + channelNum++; + } + } + // Save search stations to database by batch + try { + mContext.getContentResolver().applyBatch(FmRadioStation.AUTHORITY, ops); + } catch (RemoteException e) { + Log.d(TAG, "Exception when applyBatch searched stations " + e); + } catch (OperationApplicationException e) { + Log.d(TAG, "Exception when applyBatch searched stations " + e); + } + } + Log.d(TAG, "insertSearchedStation.firstValidChannel:" + firstValidChannel + + ",channelNum:" + channelNum); + return (new int[] { + firstValidChannel, channelNum + }); + } + + /** + * The background handler + */ + class FmRadioServiceHandler extends Handler { + public FmRadioServiceHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + Bundle bundle; + boolean isPowerup = false; + boolean isSwitch = true; + + switch (msg.what) { + + // power up + case FmRadioListener.MSGID_POWERUP_FINISHED: + bundle = msg.getData(); + handlePowerUp(bundle); + break; + + // power down + case FmRadioListener.MSGID_POWERDOWN_FINISHED: + handlePowerDown(); + break; + + // fm exit + case FmRadioListener.MSGID_FM_EXIT: + if (mIsSpeakerUsed) { + setSpeakerPhoneOn(false); + } + powerDown(); + closeDevice(); + // Release FM player upon exit + if (null != mFmPlayer) { + mFmPlayer.release(); + mFmPlayer = null; + } + + bundle = new Bundle(1); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_FM_EXIT); + notifyActivityStateChanged(bundle); + // Finish favorite when exit FM + if (sExitListener != null) { + sExitListener.onExit(); + } + break; + + // switch antenna + case FmRadioListener.MSGID_SWITCH_ANNTENNA: + bundle = msg.getData(); + int value = bundle.getInt(FmRadioListener.SWITCH_ANNTENNA_VALUE); + + // if not support short antenna, just notify, not need to switch antenna. + if (SHORT_ANNTENNA_SUPPORT) { + isSwitch = (switchAntenna(value) == 0) ? true : false; + Log.d(TAG, "FmServiceHandler.switch anntenna:isSwitch:" + isSwitch); + } else { + // if ear phone insert, need dismiss plugin earphone + // dialog + // if earphone plug out and it is not play recorder + // state, show plug dialog. + if (0 == value) { + Log.d(TAG, "FmServiceHandler.switch anntenna:dismiss dialog"); + // powerUpAsync(FMRadioUtils.computeFrequency(mCurrentStation)); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, true); + notifyActivityStateChanged(bundle); + } else { + // ear phone plug out, and recorder state is not + // play recorder state, + // show dialog. + if (mRecordState != FmRecorder.STATE_PLAYBACK) { + Log.d(TAG, "FmServiceHandler.switch anntenna:show dialog"); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false); + notifyActivityStateChanged(bundle); + } + } + } + break; + + // tune to station + case FmRadioListener.MSGID_TUNE_FINISHED: + bundle = msg.getData(); + float tuneStation = bundle.getFloat(FM_FREQUENCY); + boolean isTune = tuneStation(tuneStation); + // if tune fail, pass current station to update ui + if (!isTune) { + tuneStation = FmRadioUtils.computeFrequency(mCurrentStation); + } + bundle = new Bundle(4); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_TUNE_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isTune); + bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, tuneStation); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, mIsPowerUp); + notifyActivityStateChanged(bundle); + break; + + // seek to station + case FmRadioListener.MSGID_SEEK_FINISHED: + bundle = msg.getData(); + mIsSeeking = true; + float seekStation = seekStation(bundle.getFloat(FM_FREQUENCY), + bundle.getBoolean(OPTION)); + boolean isSeekTune = false; + int station = FmRadioUtils.computeStation(seekStation); + if (FmRadioUtils.isValidStation(station)) { + isSeekTune = tuneStation(seekStation); + } + // if tune fail, pass current station to update ui + if (!isSeekTune) { + seekStation = FmRadioUtils.computeFrequency(mCurrentStation); + } + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_TUNE_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isSeekTune); + bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, seekStation); + notifyActivityStateChanged(bundle); + mIsSeeking = false; + break; + + // start scan + case FmRadioListener.MSGID_SCAN_FINISHED: + int[] channels = null; + int[] result = null; + int scanTuneStation = 0; + boolean isScan = true; + mIsScanning = true; + if (powerUpFm(FmRadioUtils.DEFAULT_STATION_FLOAT)) { + channels = startScan(); + } + + // check whether cancel scan + if ((null != channels) && channels[0] == -100) { + Log.d(TAG, "user canceled scan:channels[0]=" + channels[0]); + isScan = false; + result = new int[] { + -1, 0 + }; + } else { + result = insertSearchedStation(channels); + scanTuneStation = result[0]; + isTune = tuneStation(FmRadioUtils.computeFrequency(scanTuneStation)); + scanTuneStation = isTune ? scanTuneStation : mCurrentStation; + } + + /* + * if there is stop command when scan, so it needs to mute + * fm avoid fm sound come out. + */ + if (mIsAudioFocusHeld) { + Log.d(TAG, "there is not power down command.set mute false"); + setMute(false); + } + bundle = new Bundle(4); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SCAN_FINISHED); + bundle.putInt(FmRadioListener.KEY_TUNE_TO_STATION, scanTuneStation); + bundle.putInt(FmRadioListener.KEY_STATION_NUM, result[1]); + bundle.putBoolean(FmRadioListener.KEY_IS_SCAN, isScan); + notifyActivityStateChanged(bundle); + mIsScanning = false; + break; + + // audio focus changed + case FmRadioListener.MSGID_AUDIOFOCUS_CHANGED: + bundle = msg.getData(); + int focusState = bundle.getInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED); + updateAudioFocus(focusState); + break; + + case FmRadioListener.MSGID_SET_RDS_FINISHED: + bundle = msg.getData(); + setRds(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_SET_MUTE_FINISHED: + bundle = msg.getData(); + setMute(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_ACTIVE_AF_FINISHED: + activeAF(); + break; + + /********** recording **********/ + case FmRadioListener.MSGID_STARTRECORDING_FINISHED: + startRecording(); + break; + + case FmRadioListener.MSGID_STOPRECORDING_FINISHED: + stopRecording(); + break; + + case FmRadioListener.MSGID_STARTPLAYBACK_FINISHED: + boolean isStart = startPlayback(); + // Can not start play back, call back to activity. + if (!isStart) { + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_RECORDERROR); + bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, + FmRadioListener.NOT_AUDIO_FOCUS); + notifyActivityStateChanged(bundle); + } + break; + + case FmRadioListener.MSGID_STOPPLAYBACK_FINISHED: + stopPlayback(); + break; + + case FmRadioListener.MSGID_RECORD_MODE_CHANED: + bundle = msg.getData(); + setRecordingMode(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_SAVERECORDING_FINISHED: + bundle = msg.getData(); + saveRecording(bundle.getString(RECODING_FILE_NAME)); + break; + + default: + break; + } + } + + } + + /** + * handle power down, execute power down and call back to activity. + */ + private void handlePowerDown() { + Bundle bundle; + boolean isPowerdown = powerDown(); + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERDOWN_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_DOWN, isPowerdown); + notifyActivityStateChanged(bundle); + } + + /** + * handle power up, execute power up and call back to activity. + * + * @param bundle power up frequency + */ + private void handlePowerUp(Bundle bundle) { + boolean isPowerup = false; + boolean isSwitch = true; + Log.d(TAG, "service handler power up start"); + float curFrequency = bundle.getFloat(FM_FREQUENCY); + + if (!SHORT_ANNTENNA_SUPPORT && !isAntennaAvailable()) { + Log.d(TAG, "call back to activity, earphone is not ready"); + mIsPowerUping = false; + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false); + notifyActivityStateChanged(bundle); + return; + } + + if (powerUpFm(curFrequency)) { + isPowerup = startPlayFm(curFrequency); + mPausedByTransientLossOfFocus = false; + } + mIsPowerUping = false; + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERUP_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, isPowerup); + notifyActivityStateChanged(bundle); + Log.d(TAG, "service handler power up end"); + } + + /** + * check FM is foreground or background + */ + public boolean isActivityForeground() { + boolean isForeground = true; + List<RunningAppProcessInfo> appProcessInfos = mActivityManager.getRunningAppProcesses(); + for (RunningAppProcessInfo appProcessInfo : appProcessInfos) { + if (appProcessInfo.processName.equals(mContext.getPackageName())) { + int importance = appProcessInfo.importance; + Log.d(TAG, "isActivityForeground importance:" + importance); + if (importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND || + importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) { + Log.d(TAG, "isActivityForeground is foreground"); + isForeground = true; + } else { + Log.d(TAG, "isActivityForeground is background"); + isForeground = false; + } + break; + } + } + Log.d(TAG, "isActivityForeground return " + isForeground); + return isForeground; + } + + /** + * Check if current is lock task mode. If in this mode, AMS will cannot destory + * FmRadioActivity even call finish() + * Settings->Security->Screen pinning on + * @return true if current screen pinning on FmRadioActivity + */ + public boolean isInLockTaskMode() { + Log.d(TAG, "isInLockTaskMode:" + mActivityManager.isInLockTaskMode()); + return mActivityManager.isInLockTaskMode(); + } + + /** + * Get the recording sdcard path when staring record + * + * @return sdcard path like "/storage/sdcard0" + */ + public static String getRecordingSdcard() { + return sRecordingSdcard; + } + + /** + * The listener interface for exit + */ + public interface OnExitListener { + /** + * When Service finish, should notify FmRadioFavorite to finish + */ + void onExit(); + } + + /** + * Register the listener for exit + * + * @param listener The listener want to know the exit event + */ + public static void registerExitListener(OnExitListener listener) { + sExitListener = listener; + } + + /** + * Unregister the listener for exit + * + * @param listener The listener want to know the exit event + */ + public static void unregisterExitListener(OnExitListener listener) { + sExitListener = null; + } + + /** + * Get the latest recording name the show name in save dialog but saved in + * service + * + * @return The latest recording name or null for not modified + */ + public String getModifiedRecordingName() { + Log.d(TAG, "getRecordingNameInDialog:" + mModifiedRecordingName); + return mModifiedRecordingName; + } + + /** + * Set the latest recording name if modify the default name + * + * @param name The latest recording name or null for not modified + */ + public void setModifiedRecordingName(String name) { + Log.d(TAG, "setRecordingNameInDialog:" + name); + mModifiedRecordingName = name; + } + + /** + * When FmRadioActivity.onStop() set true, FmRadioActivity.onResume() set false; + * @param stop + */ + public static void setActivityIsOnStop(boolean stop) { + sActivityIsOnStop = stop; + } + + /** + * Check current is in call/ringtone or not + * @return true if is not call mode. false mean is in call or ringtone + */ + public boolean isModeNormal() { + int mode = mAudioManager.getMode(); + Log.d(TAG, "isInCall mode:" + mode); + return mode == AudioManager.MODE_NORMAL; + } + + // FM Radio EM start + /** + * Inquiry if fm stereo mono(true, stereo; false mono) + * + * @return (true, stereo; false, mono) + */ + public boolean getStereoMono() { + Log.d(TAG, "FMRadioService.getStereoMono"); + return FmRadioNative.stereoMono(); + } + + /** + * Force set to stero/mono mode + * + * @param isMono + * (true, mono; false, stereo) + * @return (true, success; false, failed) + */ + public boolean setStereoMono(boolean isMono) { + Log.d(TAG, "FMRadioService.setStereoMono: isMono=" + isMono); + return FmRadioNative.setStereoMono(isMono); + } + + /** + * set RSSI, desense RSSI, mute gain soft + * @param index flag which will execute + * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold) + * @param value send to native + * @return execute ok or not + */ + public boolean setEmth(int index, int value) { + Log.d(TAG, ">>> FMRadioService.setEmth: index=" + index + ",value=" + value); + boolean isOk = FmRadioNative.emsetth(index, value); + Log.d(TAG, "<<< FMRadioService.setEmth: isOk=" + isOk); + return isOk; + } + + /** + * send variables to native, and get some variables return. + * @param val send to native + * @return get value from native + */ + public short[] emcmd(short[] val) { + Log.d(TAG, ">>FMRadioService.emcmd: val=" + val); + short[] shortCmds = null; + shortCmds = FmRadioNative.emcmd(val); + Log.d(TAG, "<<FMRadioService.emcmd:" + shortCmds); + return shortCmds; + } + + /** + * Get hardware version not need async + */ + public int[] getHardwareVersion() { + return FmRadioNative.getHardwareVersion(); + } + + /** + * Read cap array method not need async + */ + public int getCapArray() { + Log.d(TAG, "FMRadioService.readCapArray"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readCapArray(); + } + + /** + * Get rssi not need async + */ + public int getRssi() { + Log.d(TAG, "FMRadioService.readRssi"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readRssi(); + } + + /** + * read rds bler not need async + */ + public int getRdsBler() { + Log.d(TAG, "FMRadioService.readRdsBler"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readRdsBler(); + } + // FM Radio EM end + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~ new file mode 100755 index 0000000..41a794f --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioService.java~ @@ -0,0 +1,2802 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.ActivityManager; +import android.app.ActivityManager.RunningAppProcessInfo; +import android.app.Notification; +import android.app.PendingIntent; +import android.app.Service; +import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; +import android.content.ContentProviderOperation; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.OperationApplicationException; +import android.content.res.Configuration; +import android.media.AudioManager; +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.media.AudioSystem; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Binder; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.os.RemoteException; +import android.util.Log; + +import com.mediatek.fmradio.FmRadioStation.Station; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +/* Vanzo:tanglei on: Sat, 14 Mar 2015 11:51:16 +0800 + */ +//import com.android.featureoption.FeatureOption; +// End of Vanzo:tanglei + +/** + * Background service to control FM or do background tasks. + */ +public class FmRadioService extends Service implements FmRecorder.OnRecorderStateChangedListener { + // Logging + private static final String TAG = "FmRx/Service"; + + // Broadcast messages from clients to FM service. + public static final String ACTION_TOFMSERVICE_POWERDOWN + = "com.mediatek.FMRadio.FMRadioService.ACTION_TOFMSERVICE_POWERDOWN"; + // Broadcast messages to FM Tx service. + public static final String ACTION_TOFMTXSERVICE_POWERDOWN + = "com.mediatek.FMTransmitter.FMTransmitterService.ACTION_TOFMTXSERVICE_POWERDOWN"; + // Broadcast messages to mATV service. + public static final String ACTION_TOATVSERVICE_POWERDOWN + = "com.mediatek.app.mtv.ACTION_REQUEST_SHUTDOWN"; + // Broadcast messages to music service. + public static final String ACTION_TOMUSICSERVICE_POWERDOWN + = "com.android.music.musicservicecommand.pause"; + // Broadcast messages from mATV service. + public static final String ACTION_FROMATVSERVICE_POWERUP = "com.mediatek.app.mtv.POWER_ON"; + + // Broadcast messages from other sounder APP to FM service + private static final String SOUND_POWER_DOWN_MSG = "com.android.music.musicservicecommand"; + private static final String CMDPAUSE = "pause"; + + // HandlerThread Keys + private static final String FM_FREQUENCY = "frequency"; + private static final String OPTION = "option"; + private static final String RECODING_FILE_NAME = "name"; + + // RDS events + // PS + private static final int RDS_EVENT_PROGRAMNAME = 0x0008; + // RT + private static final int RDS_EVENT_LAST_RADIOTEXT = 0x0040; + // AF + private static final int RDS_EVENT_AF = 0x0080; + + // Headset + private static final int HEADSET_PLUG_IN = 1; + // Short antenna support + private static final boolean SHORT_ANNTENNA_SUPPORT = FmRadioUtils.isFmShortAntennaSupport(); + + // Notification id + private static final int NOTIFICATION_ID = 1; + + // Set audio policy for FM + // should check AUDIO_POLICY_FORCE_FOR_MEDIA in audio_policy.h + private static final int FOR_PROPRIETARY = 1; + // Forced Use value + private int mForcedUseForMedia; + + // TX and RX interaction + private static final int CURRENT_RX_ON = 0; + private static final int CURRENT_TX_ON = 1; + private static final int CURRENT_TX_SCAN = 2; + + // FM recorder + FmRecorder mFmRecorder = null; + private BroadcastReceiver mSdcardListener = null; + private int mRecordState = FmRecorder.STATE_INVALID; + private int mRecorderErrorType = -1; + // If eject record sdcard, should set Value false to not record. + // Key is sdcard path(like "/storage/sdcard0"), V is to enable record or + // not. + private HashMap<String, Boolean> mSdcardStateMap = new HashMap<String, Boolean>(); + // The show name in save dialog but saved in service + // If modify the save title it will be not null, otherwise it will be null + private String mModifiedRecordingName = null; + // record the listener list, will notify all listener in list + private ArrayList<Record> mRecords = new ArrayList<Record>(); + // record FM whether in recording mode + private boolean mIsInRecordingMode = false; + // record sd card path when start recording + private static String sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + + // RDS + // PS String + private String mPSString = ""; + // RT String + private String mLRTextString = ""; + // PS RT + private boolean mIsPSRTEnabled = false; + // AF + private boolean mIsAFEnabled = false; + // RDS thread use to receive the information send by station + private Thread mRdsThread = null; + // record whether RDS thread exit + private boolean mIsRdsThreadExit = false; + + // State variables + // Record whether FM is in native scan state + private boolean mIsNativeScanning = false; + // Record whether FM is in scan thread + private boolean mIsScanning = false; + // Record whether FM is in seeking state + private boolean mIsNativeSeeking = false; + // Record whether FM is in native seek + private boolean mIsSeeking = false; + // Record whether searching progress is canceled + private boolean mIsStopScanCalled = false; + // Record whether is speaker used + private boolean mIsSpeakerUsed = false; + // Record whether device is open + private boolean mIsDeviceOpen = false; + // Record whether FM is power up + private boolean mIsPowerUp = false; + // Record whether is power uping, if so, should judge in activity back key. + private boolean mIsPowerUping = false; + // Record whether service is init + private boolean mIsServiceInited = false; + // Fm power down by loss audio focus,should make power down menu item can + // click + private boolean mIsMakePowerDown = false; + + // Instance variables + private Context mContext = null; + private AudioManager mAudioManager = null; + private ActivityManager mActivityManager = null; + private MediaPlayer mFmPlayer = null; + private WakeLock mWakeLock = null; + // Audio focus is held or not + private boolean mIsAudioFocusHeld = false; + // Focus transient lost + private boolean mPausedByTransientLossOfFocus = false; + private int mCurrentStation = FmRadioUtils.DEFAULT_STATION; + // Headset plug state (0:long antenna plug in, 1:long antenna plug out) + private int mValueHeadSetPlug = 1; + // For bind service + private final IBinder mBinder = new ServiceBinder(); + // Broadcast to receive the external event + private FmServiceBroadcastReceiver mBroadcastReceiver = null; + // Async handler + private FmRadioServiceHandler mFmServiceHandler; + // Lock for lose audio focus and receive SOUND_POWER_DOWN_MSG + // at the same time + // while recording call stop recording not finished(status is still + // RECORDING), but + // SOUND_POWER_DOWN_MSG will exitFm(), if it is RECORDING will discard the + // record. + // 1. lose audio focus -> stop recording(lock) -> set to IDLE and show save + // dialog + // 2. exitFm() -> check the record status, discard it if it is recording + // status(lock) + // Add this lock the exitFm() while stopRecording() + private Object mStopRecordingLock = new Object(); + // The listener for exit, should finish favorite when exit FM + private static OnExitListener sExitListener = null; + // Record FmRadioActivity state + private static boolean sActivityIsOnStop = false; + + @Override + public IBinder onBind(Intent intent) { + Log.d(TAG, "FmRadioService.onBind: " + intent); + return mBinder; + } + + /** + * class use to return service instance + */ + public class ServiceBinder extends Binder { + /** + * get FM service instance + * + * @return service instance + */ + FmRadioService getService() { + return FmRadioService.this; + } + } + + /** + * Broadcast monitor external event, Other app want FM stop, Phone shut + * down, screen state, headset state + */ + private class FmServiceBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, ">>> FmRadioService.onReceive"); + String action = intent.getAction(); + String command = intent.getStringExtra("command"); + Log.d(TAG, "Action/Command: " + action + " / " + command); + // other app want FM stop, stop FM + if (ACTION_TOFMSERVICE_POWERDOWN.equals(action) + || ACTION_FROMATVSERVICE_POWERUP.equals(action) + || (SOUND_POWER_DOWN_MSG.equals(action) && CMDPAUSE.equals(command))) { + // need remove all messages, make power down will be execute + mFmServiceHandler.removeCallbacksAndMessages(null); + + Log.d(TAG, "onReceive.SOUND_POWER_DOWN_MSG. exit FM"); + exitFm(); + stopSelf(); + // phone shut down, so exit FM + } else if (Intent.ACTION_SHUTDOWN.equals(action)) { + /** + * here exitFm, system will send broadcast, system will shut + * down, so fm does not need call back to activity + */ + mFmServiceHandler.removeCallbacksAndMessages(null); + exitFm(); + // screen on, if FM play, open rds + } else if (Intent.ACTION_SCREEN_ON.equals(action)) { + + setRdsAsync(true); + // screen off, if FM play, close rds + } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { + setRdsAsync(false); + // switch antenna when headset plug in or plug out + } else if (Intent.ACTION_HEADSET_PLUG.equals(action)) { + // switch antenna should not impact audio focus status + mValueHeadSetPlug = (intent.getIntExtra("state", -1) == HEADSET_PLUG_IN) ? 0 : 1; + switchAntennaAsync(mValueHeadSetPlug); + + if (SHORT_ANNTENNA_SUPPORT) { + boolean isSwitch = (switchAntenna(mValueHeadSetPlug) == 0) ? true : false; + Log.d(TAG, "onReceive.switch anntenna:isWitch:" + isSwitch); + + // Plug out->Speaker Mode; Plug in->Earphone Mode + boolean plugInEarphone = (0 == mValueHeadSetPlug); + // Need check to switch to earphone mode for audio will + // change to AudioSystem.FORCE_NONE + if (plugInEarphone) { + mForcedUseForMedia = AudioSystem.FORCE_NONE; + mIsSpeakerUsed = false; + } + //setSpeakerPhoneOn(!plugInEarphone); + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, !plugInEarphone); + notifyActivityStateChanged(bundle); + + powerUpAutoIfNeed(); + } else { + // Avoid Service is killed,and receive headset plug in + // broadcast again + if (!mIsServiceInited) { + Log.d(TAG, "onReceive.switch anntenna:service is not init"); + powerUpAutoIfNeed(); + return; + } + /* + * If ear phone insert and activity is + * foreground. power up FM automatic + */ + if ((0 == mValueHeadSetPlug) && isActivityForeground()) { + Log.d(TAG, "onReceive.switch anntenna:need auto power up"); + powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + } else if (1 == mValueHeadSetPlug) { + Log.d(TAG, "plug out earphone, need to stop fm"); + // ALPS01687760 Avoid sound from speaker after plug out earphone when recording + // plug out earphone will power down or exit, need to mute first anyway + setMute(true); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_POWERDOWN_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_POWERUP_FINISHED); + stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS); + + // Need check to switch to earphone mode for audio will + // change to AudioSystem.FORCE_NONE + setSpeakerPhoneOn(false); + + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false); + notifyActivityStateChanged(bundle); + } + } + + } else if (BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED.equals(action)) { + int connectState = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, 0); + Log.d(TAG, "ACTION_CONNECTION_STATE_CHANGED: connectState=" + connectState + ", ispowerup=" + + mIsPowerUp); + handleBtConnectState(connectState); +/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:26:14 +0800 + * earphone key action + */ + } //else if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION && "com.mediatek.FMRadio.FMRadioService.NEXT_STATION".equals(action)) { + //seekStationAsync(FmRadioUtils.computeFrequency(mCurrentStation), true); +// End of Vanzo:tanglei + //} + else { + Log.w(TAG, "Error: undefined action."); + } + Log.d(TAG, "<<< FmRadioService.onReceive"); + } + } + + /** + * ALPS01756692 No sound after click FM app and power key + * Need to power up auto for two cases: + * case 1: Launcher click FM app, then quickly click Power key to lock phone. + * case 2: Launcher click FM app, then quickly click Home key. + * Because power up action is in FmRadioActivity.onServiceConnected(), these two cases + * will not callback onServiceConnected() cause FmRadioActivity.onStop() has called unbind() + */ + private void powerUpAutoIfNeed() { + if ((0 == mValueHeadSetPlug)) { + if (!mIsPowerUping && !mIsPowerUp && sActivityIsOnStop) { + Log.w(TAG, "Power up for start app then quick click power/home"); + int iCurrentStation = FmRadioStation.getCurrentStation(mContext); + powerUpAsync(FmRadioUtils.computeFrequency(iCurrentStation)); + } + } + } + + /** + * handle FM over BT connect state + * + * @param connectState + * FM over BT connect state + */ + private void handleBtConnectState(int connectState) { + if (!mIsPowerUp) { + return; + } + + switch (connectState) { + case BluetoothA2dp.STATE_CONNECTED: + //case BluetoothA2dp.STATE_PLAYING: + //case BluetoothA2dp.STATE_CONNECTING: + Log.d(TAG, "handleBtConnectState bt connected"); + changeToEarphoneMode(); + break; + case BluetoothA2dp.STATE_DISCONNECTED: + //case BluetoothA2dp.STATE_DISCONNECTING: + Log.d(TAG, "handleBtConnectState bt disconnected"); + changeToEarphoneMode(); + break; + default: + Log.d(TAG, "invalid fm over bt connect state"); + break; + } + + + } + + private void changeToEarphoneMode() { + setSpeakerPhoneOn(false); + // Notify UI change to earphone mode, false means not speaker mode + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_SPEAKER_MODE_CHANGED); + // Always set to earphone mode when bt is connected or disconnected + bundle.putBoolean(FmRadioListener.KEY_IS_SPEAKER_MODE, false); + notifyActivityStateChanged(bundle); + } + + /** + * Check if BT is connected + * @return true if current is playing with BT earphone + */ + public boolean isBtConnected() { + BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); + Log.d(TAG, "isBtConnected headset:" + + btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET) + + ", a2dp:" + btAdapter.getProfileConnectionState(BluetoothProfile.A2DP)); + int a2dpState = btAdapter.getProfileConnectionState(BluetoothProfile.HEADSET); + return (BluetoothProfile.STATE_CONNECTED == a2dpState + || BluetoothProfile.STATE_CONNECTING == a2dpState); + } + + /** + * Handle sdcard mount/unmount event. 1. Update the sdcard state map 2. If + * the recording sdcard is unmounted, need to stop and notify + */ + private class SdcardListener extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + // If eject record sdcard, should set this false to not + // record. + updateSdcardStateMap(intent); + + if (mFmRecorder == null) { + Log.w(TAG, "SD receiver: FMRecorder is not present!!"); + return; + } + + String action = intent.getAction(); + if (Intent.ACTION_MEDIA_EJECT.equals(action) || + Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + // If not unmount recording sd card, do nothing; + if (isRecordingCardUnmount(intent)) { + Log.v(TAG, "MEDIA_EJECT"); + if (mFmRecorder.getState() == FmRecorder.STATE_RECORDING) { + Log.d(TAG, "old state is recording"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + mFmRecorder.discardRecording(); + } else { + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_RECORDSTATE_CHANGED); + bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, + FmRecorder.STATE_IDLE); + notifyActivityStateChanged(bundle); + } + } + return; + } + } + } + + /** + * whether antenna available + * + * @return true, antenna available; false, antenna not available + */ + public boolean isAntennaAvailable() { + return mAudioManager.isWiredHeadsetOn(); + } + + /** + * Set FM audio from speaker or not + * + * @param isSpeaker true if set FM audio from speaker + */ + public void setSpeakerPhoneOn(boolean isSpeaker) { + Log.d(TAG, ">>> FmRadioService.useSpeaker: " + isSpeaker); + mForcedUseForMedia = isSpeaker ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; + AudioSystem.setForceUse(FOR_PROPRIETARY, mForcedUseForMedia); + mIsSpeakerUsed = isSpeaker; + Log.d(TAG, "<<< FmRadioService.useSpeaker"); + } + + private boolean isSpeakerPhoneOn() { + return (mForcedUseForMedia == AudioSystem.FORCE_SPEAKER); + } + + /** + * open FM device, should be call before power up + * + * @return true if FM device open, false FM device not open + */ + private boolean openDevice() { + Log.d(TAG, ">>> FmRadioService.openDevice"); + if (!mIsDeviceOpen) { + mIsDeviceOpen = FmRadioNative.openDev(); + } + Log.d(TAG, "<<< FmRadioService.openDevice: " + mIsDeviceOpen); + return mIsDeviceOpen; + } + + /** + * close FM device + * + * @return true if close FM device success, false close FM device failed + */ + private boolean closeDevice() { + Log.d(TAG, ">>> FmRadioService.closeDevice"); + boolean isDeviceClose = false; + if (mIsDeviceOpen) { + isDeviceClose = FmRadioNative.closeDev(); + mIsDeviceOpen = !isDeviceClose; + } + Log.d(TAG, "<<< FmRadioService.closeDevice: " + isDeviceClose); + + // quit looper + mFmServiceHandler.getLooper().quit(); + return isDeviceClose; + } + + /** + * get FM device opened or not + * + * @return true FM device opened, false FM device closed + */ + public boolean isDeviceOpen() { + Log.d(TAG, "FmRadioService.isDeviceOpen: " + mIsDeviceOpen); + return mIsDeviceOpen; + } + + /** + * power up FM, and make FM voice output from earphone + * + * @param frequency + */ + public void powerUpAsync(float frequency) { + mIsPowerUping = true; + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_POWERUP_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private boolean powerUpFm(float frequency) { + Log.d(TAG, ">>> FmRadioService.powerUp: " + frequency); + if (mIsPowerUp) { + Log.d(TAG, "<<< FmRadioService.powerUp: already power up:" + mIsPowerUp); + return true; + } + + if (!requestAudioFocus()) { + // activity used for update powerdown menu + mIsMakePowerDown = true; + Log.d(TAG, "FM can't get audio focus when power up"); + sendBroadcastToStopOtherAPP(); + return false; + } + + // if device open fail when chip reset, it need open device again before + // power up + if (!mIsDeviceOpen) { + openDevice(); + } + + waitIfTxSearching(); + Log.d(TAG, "set CURRENT_RX_ON true, CURRENT_TX_ON false"); + FmRadioNative.setFmStatus(CURRENT_RX_ON, true); + FmRadioNative.setFmStatus(CURRENT_TX_ON, false); + sendBroadcastToStopOtherAPP(); + + Log.d(TAG, "service native power up start"); + if (!FmRadioNative.powerUp(frequency)) { + Log.e(TAG, "Error: powerup failed."); + return false; + } + Log.d(TAG, "service native power up end"); + mIsPowerUp = true; + // need mute after power up + setMute(true); + + // activity used for update powerdown menu + mIsMakePowerDown = false; + Log.d(TAG, "<<< FmRadioService.powerUp: " + mIsPowerUp); + return mIsPowerUp; + } + + // wait if TX is searching for timing issue + private void waitIfTxSearching() { + Log.d(TAG, ">>> waitIfTxSearching " + FmRadioNative.getFmStatus(CURRENT_TX_SCAN)); + long start = System.currentTimeMillis(); + // true for TX is searching + while (FmRadioNative.getFmStatus(CURRENT_TX_SCAN) == true) { + if (System.currentTimeMillis() - start > 5000) { + Log.e(TAG, "waitIfTxSearching timeout"); + break; + } + try { + Thread.sleep(100); + } catch (Exception e) { + } + } + Log.d(TAG, "<<< waitIfTxSearching"); + } + + private boolean startPlayFm(float frequency) { + Log.d(TAG, ">>> FmRadioService.initDevice: " + frequency); + + mCurrentStation = FmRadioUtils.computeStation(frequency); + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + // Add notification to the title bar. + showNotification(); + + // Start the RDS thread if RDS is supported. + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Start the RDS thread."); + startRdsThread(); + } + + if (!FmRadioUtils.isFmSuspendSupport()) { + if (!mWakeLock.isHeld()) { + mWakeLock.acquire(); + Log.d(TAG, "acquire wake lock"); + } + } + if (mIsSpeakerUsed != isSpeakerPhoneOn()) { + setSpeakerPhoneOn(mIsSpeakerUsed); + } + if (mRecordState != FmRecorder.STATE_PLAYBACK) { + enableFmAudio(true); + } + + setRds(true); + setMute(false); + + Log.d(TAG, "<<< FmRadioService.initDevice: " + mIsPowerUp); + return mIsPowerUp; + } + + /** + * send broadcast to stop other application, such as music, MATV, + * FMTransmitter + */ + private void sendBroadcastToStopOtherAPP() { + Intent intentToMusic = new Intent(ACTION_TOMUSICSERVICE_POWERDOWN); + sendBroadcast(intentToMusic); + Intent intentToAtv = new Intent(ACTION_TOATVSERVICE_POWERDOWN); + sendBroadcast(intentToAtv); + Intent intentToFMTx = new Intent(ACTION_TOFMTXSERVICE_POWERDOWN); + sendBroadcast(intentToFMTx); + } + + /** + * power down FM + */ + public void powerDownAsync() { + // if power down Fm, should remove message first. + // not remove all messages, because such as recorder message need + // to execute after or before power down + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_POWERDOWN_FINISHED); + } + + /** + * Power down FM + * + * @return true if power down success + */ + private boolean powerDown() { + Log.d(TAG, ">>> FmRadioService.powerDown"); + if (!mIsPowerUp) { + Log.w(TAG, "Error: device is already power down."); + return true; + } + + setMute(true); + setRds(false); + enableFmAudio(false); + + // Only need to power down if RX status in native is ON + // If TX is on, so need power down(TX is using). + boolean isRxOn = FmRadioNative.getFmStatus(CURRENT_RX_ON); + boolean powerDownSuccess = false; + if (isRxOn) { + powerDownSuccess = FmRadioNative.powerDown(0); + } else { + powerDownSuccess = true; + } + + if (!powerDownSuccess) { + Log.e(TAG, "Error: powerdown failed."); + // activity used for update powerdown menu + mIsMakePowerDown = true; + + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + mIsPowerUp = false; + if (mWakeLock.isHeld()) { + mWakeLock.release(); + Log.d(TAG, "release wake lock"); + } + // Remove the notification in the title bar. + removeNotification(); + Log.d(TAG, "powerdown failed.release some resource."); + return false; + } + // activity used for update powerdown menu + mIsMakePowerDown = true; + + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + mIsPowerUp = false; + + if (mWakeLock.isHeld()) { + mWakeLock.release(); + Log.d(TAG, "release wake lock"); + } + + // Remove the notification in the title bar. + removeNotification(); + Log.d(TAG, "<<< FmRadioService.powerDown: true"); + return true; + } + + /** + * Check whether FM is power up + * + * @return true, power up; false, power down. + */ + public boolean isPowerUp() { + Log.d(TAG, "FmRadioService.isPowerUp: " + mIsPowerUp); + return mIsPowerUp; + } + + /** + * Check whether FM is power uping. if power uping, activity should call + * super.onBackPressed, avoid not execute power down method. + * + * @return true, power up; false, power down. + */ + public boolean isPowerUping() { + Log.d(TAG, "FmRadioService.isPowerUping: " + mIsPowerUping); + return mIsPowerUping; + } + + /** + * Check whether FM is power down by other app. + * + * @return true, power down; true. + */ + public boolean isMakePowerDown() { + Log.d(TAG, "FmRadioService.mIsMakePowerDown: " + mIsMakePowerDown); + return mIsMakePowerDown; + } + + /** + * Tune to a station + * + * @param frequency The frequency to tune + * + * @return true, success; false, fail. + */ + public void tuneStationAsync(float frequency) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_TUNE_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_TUNE_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private boolean tuneStation(float frequency) { + Log.d(TAG, ">>> FmRadioService.tune: " + frequency); + if (mIsPowerUp) { + setRds(false); + Log.d(TAG, "FmRadioService.native tune start"); + boolean bRet = FmRadioNative.tune(frequency); + Log.d(TAG, "FmRadioService.native tune end"); + if (bRet) { + setRds(true); + mCurrentStation = FmRadioUtils.computeStation(frequency); + FmRadioStation.setCurrentStation(mContext, mCurrentStation); + updateNotification(); + } + setMute(false); + Log.d(TAG, "<<< FmRadioService.tune: " + bRet); + return bRet; + } + + // if not support short Antenna and earphone is not insert, not power up + if (!isAntennaAvailable() && !SHORT_ANNTENNA_SUPPORT) { + Log.d(TAG, "earphone is not insert and short antenna not support"); + return false; + } + + // if not power up yet, should powerup first + Log.w(TAG, "FM is not powered up"); + mIsPowerUping = true; + boolean tune = false; + + if (powerUpFm(frequency)) { + tune = startPlayFm(frequency); + } + mIsPowerUping = false; + Log.d(TAG, "<<< FmRadioService.tune: mIsPowerup:" + tune); + return tune; + } + + /** + * Seek station according frequency and direction + * + * @param frequency start frequency(100KHZ, 87.5) + * @param isUp direction(true, next station; false, previous station) + * + * @return the frequency after seek + */ + public void seekStationAsync(float frequency, boolean isUp) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + final int bundleSize = 2; + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, frequency); + bundle.putBoolean(OPTION, isUp); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SEEK_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private float seekStation(float frequency, boolean isUp) { + Log.d(TAG, ">>> FmRadioService.seek: " + frequency + " " + isUp); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + + setRds(false); + mIsNativeSeeking = true; + float fRet = FmRadioNative.seek(frequency, isUp); + mIsNativeSeeking = false; + // make mIsStopScanCalled false, avoid stop scan make this true, + // when start scan, it will return null. + mIsStopScanCalled = false; + Log.d(TAG, "<<< FmRadioService.seek: " + fRet); + return fRet; + } + + /** + * Scan stations + */ + public void startScanAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_SCAN_FINISHED); + } + + private int[] startScan() { + Log.d(TAG, ">>> FmRadioService.startScan"); + int[] iChannels = null; + + setRds(false); + setMute(true); + short[] shortChannels = null; + if (!mIsStopScanCalled) { + mIsNativeScanning = true; + Log.d(TAG, "startScan native method:start"); + shortChannels = FmRadioNative.autoScan(); + Log.d(TAG, "startScan native method:end " + Arrays.toString(shortChannels)); + mIsNativeScanning = false; + } + + setRds(true); + if (mIsStopScanCalled) { + // Received a message to power down FM, or interrupted by a phone + // call. Do not return any stations. shortChannels = null; + // if cancel scan, return invalid station -100 + shortChannels = new short[] { + -100 + }; + mIsStopScanCalled = false; + } + + if (null != shortChannels) { + int size = shortChannels.length; + iChannels = new int[size]; + for (int i = 0; i < size; i++) { + iChannels[i] = shortChannels[i]; + } + } + Log.d(TAG, "<<< FmRadioService.startScan: " + Arrays.toString(iChannels)); + return iChannels; + } + + /** + * Check FM Radio is in scan progress or not + * + * @return if in scan progress return true, otherwise return false. + */ + public boolean isScanning() { + return mIsScanning; + } + + /** + * Stop scan progress + * + * @return true if can stop scan, otherwise return false. + */ + public boolean stopScan() { + Log.d(TAG, ">>> FmRadioService.stopScan"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return false; + } + + boolean bRet = false; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SCAN_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SEEK_FINISHED); + if (mIsNativeScanning || mIsNativeSeeking) { + mIsStopScanCalled = true; + Log.d(TAG, "native stop scan:start"); + bRet = FmRadioNative.stopScan(); + Log.d(TAG, "native stop scan:end --" + bRet); + } + Log.d(TAG, "<<< FmRadioService.stopScan: " + bRet); + return bRet; + } + + /** + * Check FM is in seek progress or not + * + * @return true if in seek progress, otherwise return false. + */ + public boolean isSeeking() { + return mIsNativeSeeking; + } + + /** + * Set RDS + * + * @param on true, enable RDS; false, disable RDS. + */ + public void setRdsAsync(boolean on) { + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_RDS_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, on); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_RDS_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private int setRds(boolean on) { + if (!mIsPowerUp) { + return -1; + } + Log.d(TAG, ">>> FmRadioService.setRDS: " + on); + int ret = -1; + if (isRdsSupported()) { + ret = FmRadioNative.setRds(on); + } + setPS(""); + setLRText(""); + Log.d(TAG, "<<< FmRadioService.setRDS: " + ret); + return ret; + } + + /** + * Get PS information + * + * @return PS information + */ + public String getPS() { + Log.d(TAG, "FmRadioService.getPS: " + mPSString); + return mPSString; + } + + /** + * Get RT information + * + * @return RT information + */ + public String getLRText() { + Log.d(TAG, "FmRadioService.getLRText: " + mLRTextString); + return mLRTextString; + } + + /** + * Get AF frequency + * + * @return AF frequency + */ + public void activeAFAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_ACTIVE_AF_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_ACTIVE_AF_FINISHED); + } + + private int activeAF() { + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + + int frequency = FmRadioNative.activeAf(); + Log.d(TAG, "FmRadioService.activeAF: " + frequency); + return frequency; + } + + /** + * Mute or unmute FM voice + * + * @param mute true for mute, false for unmute + * + * @return (true, success; false, failed) + */ + public void setMuteAsync(boolean mute) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SET_MUTE_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, mute); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SET_MUTE_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private int setMute(boolean mute) { + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + Log.d(TAG, ">>> FmRadioService.setMute: " + mute); + int iRet = FmRadioNative.setMute(mute); + Log.d(TAG, "<<< FmRadioService.setMute: " + iRet); + return iRet; + } + + /** + * Check whether RDS is support in driver + * + * @return (true, support; false, not support) + */ + public boolean isRdsSupported() { + boolean isRdsSupported = (FmRadioNative.isRdsSupport() == 1); + Log.d(TAG, "FmRadioService.isRdsSupported: " + isRdsSupported); + return isRdsSupported; + } + + /** + * Check whether speaker used or not + * + * @return true if use speaker, otherwise return false + */ + public boolean isSpeakerUsed() { + Log.d(TAG, "FmRadioService.isSpeakerUsed: " + mIsSpeakerUsed); + return mIsSpeakerUsed; + } + + /** + * Initial service and current station + * + * @param iCurrentStation current station frequency + */ + public void initService(int iCurrentStation) { + Log.d(TAG, "FmRadioService.initService: " + iCurrentStation); + mIsServiceInited = true; + mCurrentStation = iCurrentStation; + } + + /** + * Check service is initialed or not + * + * @return true if initialed, otherwise return false + */ + public boolean isServiceInited() { + Log.d(TAG, "FmRadioService.isServiceInit: " + mIsServiceInited); + return mIsServiceInited; + } + + /** + * Get FM service current station frequency + * + * @return Current station frequency + */ + public int getFrequency() { + Log.d(TAG, "FmRadioService.getFrequency: " + mCurrentStation); + return mCurrentStation; + } + + /** + * Set FM service station frequency + * + * @param station Current station + */ + public void setFrequency(int station) { + mCurrentStation = station; + } + + /** + * resume FM audio + */ + private void resumeFmAudio() { + Log.d(TAG, "FmRadioService.resumeFmAudio"); + // If not check mIsAudioFocusHeld && mIsPowerup, when scan canceled, + // this will be resume first, then execute power down. it will cause + // nosise. + if (mIsAudioFocusHeld && mIsPowerUp) { + enableFmAudio(true); + } + } + + /** + * Switch antenna There are two types of antenna(long and short) If long + * antenna(most is this type), must plug in earphone as antenna to receive + * FM. If short antenna, means there is a short antenna if phone already, + * can receive FM without earphone. + * + * @param antenna antenna (0, long antenna, 1 short antenna) + * + * @return (0, success; 1 failed; 2 not support) + */ + public void switchAntennaAsync(int antenna) { + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SWITCH_ANNTENNA); + + Bundle bundle = new Bundle(bundleSize); + bundle.putInt(FmRadioListener.SWITCH_ANNTENNA_VALUE, antenna); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SWITCH_ANNTENNA); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + /** + * Need native support whether antenna support interface. + * + * @param antenna antenna (0, long antenna, 1 short antenna) + * + * @return (0, success; 1 failed; 2 not support) + */ + private int switchAntenna(int antenna) { + Log.d(TAG, ">>> FmRadioService.switchAntenna:" + antenna); + // if fm not powerup, switchAntenna will flag whether has earphone + int ret = FmRadioNative.switchAntenna(antenna); + Log.d(TAG, "<<< FmRadioService.switchAntenna: " + ret); + return ret; + } + + /** + * Start recording + */ + public void startRecordingAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTRECORDING_FINISHED); + } + + private void startRecording() { + Log.d(TAG, ">>> startRecording"); + if (!mIsPowerUp) { + Log.d(TAG, "native is not power up: " + mIsPowerUp); + onRecorderError(FmRecorder.ERROR_RECORDER_INVALID_STATE); + return; + } + sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + Log.d(TAG, "default sd card file path: " + sRecordingSdcard); + if (sRecordingSdcard == null || sRecordingSdcard.isEmpty()) { + Log.d(TAG, "startRecording: may be no sdcard"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + return; + } + + if (mFmRecorder == null) { + mFmRecorder = new FmRecorder(); + mFmRecorder.registerRecorderStateListener(FmRadioService.this); + } + + if (isSdcardReady(sRecordingSdcard)) { + mFmRecorder.startRecording(getApplicationContext()); + } else { + Log.d(TAG, "Cannot record because sdcard is not ready!!"); + onRecorderError(FmRecorder.ERROR_SDCARD_NOT_PRESENT); + } + Log.d(TAG, "<<< startRecording"); + } + + private boolean isSdcardReady(String sdcardPath) { + Log.d(TAG, ">>> isSdcardReady: sdcardPath is " + sdcardPath + + ", mSdcardStateMap is " + mSdcardStateMap); + if (!mSdcardStateMap.isEmpty()) { + if (mSdcardStateMap.get(sdcardPath) != null && !mSdcardStateMap.get(sdcardPath)) { + Log.d(TAG, "<<< isSdcardReady: return false"); + return false; + } + } + Log.d(TAG, "<<< isSdcardReady: mSdcardStateMap:" + mSdcardStateMap); + return true; + } + + /** + * stop recording + */ + public void stopRecordingAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPRECORDING_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPRECORDING_FINISHED); + } + + private boolean stopRecording() { + Log.d(TAG, ">>> stopRecording"); + if (mFmRecorder == null) { + Log.e(TAG, "stopRecording called without a valid recorder!!"); + return false; + } + synchronized (mStopRecordingLock) { + mFmRecorder.stopRecording(); + Log.d(TAG, "<<< stopRecording"); + } + return true; + } + + /** + * Start play recording file + */ + public void startPlaybackAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + } + + private boolean startPlayback() { + Log.d(TAG, ">>> startPlayback"); + if (!requestAudioFocus()) { + Log.d(TAG, "can't get audio focus when play recording file"); + return false; + } + + if (mFmRecorder == null) { + Log.e(TAG, "FMRecorder is null !!"); + return false; + } + + // Set Mute before start playback + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + enableFmAudio(false); + + mFmRecorder.startPlayback(); + Log.d(TAG, "<<< startPlayback"); + return true; + } + + /** + * stop play recording file + */ + public void stopPlaybackAsync() { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + } + + private void stopPlayback() { + Log.d(TAG, ">>> stopPlayback"); + if (mFmRecorder != null) { + mFmRecorder.stopPlayback(); + checkAfterPlayback(); + } + Log.d(TAG, "<<< stopPlayback"); + } + + /** + * Save recording file according name or discard recording file if name is + * null + * + * @param newName New recording file name + */ + public void saveRecordingAsync(String newName) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_SAVERECORDING_FINISHED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putString(RECODING_FILE_NAME, newName); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_SAVERECORDING_FINISHED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private void saveRecording(String newName) { + Log.d(TAG, ">>> saveRecording"); + if (mFmRecorder != null) { + if (newName != null) { + mFmRecorder.saveRecording(FmRadioService.this, newName); + Log.d(TAG, "<<< saveRecording"); + return; + } + mFmRecorder.discardRecording(); + } + Log.d(TAG, "<<< saveRecording"); + } + + /** + * Get record time + * + * @return Record time + */ + public long getRecordTime() { + if (mFmRecorder != null) { + return mFmRecorder.recordTime(); + } + Log.e(TAG, "FMRecorder is null !!"); + return 0; + } + + /** + * Set recording mode + * + * @param isRecording true, enter recoding mode; false, exit recording mode + */ + public void setRecordingModeAsync(boolean isRecording) { + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_RECORD_MODE_CHANED); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putBoolean(OPTION, isRecording); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_RECORD_MODE_CHANED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + private void setRecordingMode(boolean isRecording) { + Log.d(TAG, ">>> setRecordingMode: isRecording=" + isRecording); + mIsInRecordingMode = isRecording; + if (mFmRecorder != null) { + if (!isRecording) { + if (mFmRecorder.getState() != FmRecorder.STATE_IDLE) { + mFmRecorder.stopRecording(); + mFmRecorder.stopPlayback(); + } + resumeFmAudio(); + setMute(false); + Log.d(TAG, "<<< setRecordingMode"); + return; + } + // reset recorder to unused status + mFmRecorder.resetRecorder(); + } + Log.d(TAG, "<<< setRecordingMode"); + } + + /** + * Get current recording mode + * + * @return if in recording mode return true, otherwise return false; + */ + public boolean getRecordingMode() { + return mIsInRecordingMode; + } + + /** + * Get record state + * + * @return record state + */ + public int getRecorderState() { + if (null != mFmRecorder) { + return mFmRecorder.getState(); + } + return FmRecorder.STATE_INVALID; + } + + /** + * Get recording file name + * + * @return recording file name + */ + public String getRecordingName() { + if (null != mFmRecorder) { + return mFmRecorder.getRecordingName(); + } + return null; + } + + /** + * Get current recording file name with full path + * + * @return The current recording file name or null + */ + public String getRecordingNameWithPath() { + if (null != mFmRecorder) { + return mFmRecorder.getRecordingNameWithPath(); + } + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + Log.d(TAG, ">>> FmRadioService.onCreate"); + Log.d(TAG, "short antenna support:" + SHORT_ANNTENNA_SUPPORT); + mContext = getApplicationContext(); + mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); + mWakeLock.setReferenceCounted(false); + sRecordingSdcard = FmRadioUtils.getDefaultStoragePath(); + + if (!initFmPlayer()) { + Log.e(TAG, "init FMPlayer failed"); + return; + } + + registerFmBroadcastReceiver(); + registerSdcardReceiver(); + + HandlerThread handlerThread = new HandlerThread("FmRadioServiceThread"); + handlerThread.start(); + mFmServiceHandler = new FmRadioServiceHandler(handlerThread.getLooper()); + + openDevice(); + // set speaker to default status, avoid setting->clear data. + setSpeakerPhoneOn(mIsSpeakerUsed); + Log.d(TAG, "<<< FmRadioService.onCreate"); + } + + private boolean initFmPlayer() { + mFmPlayer = new MediaPlayer(); + if (!FmRadioUtils.isFmSuspendSupport()) { + mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK); + } + mFmPlayer.setOnErrorListener(mPlayerErrorListener); + try { + mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + } catch (IOException ex) { + // notify the user why the file couldn't be opened + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalArgumentException ex) { + // notify the user why the file couldn't be opened + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (SecurityException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } + mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + return true; + } + + private void registerFmBroadcastReceiver() { + IntentFilter filter = new IntentFilter(); + filter.addAction(SOUND_POWER_DOWN_MSG); + filter.addAction(Intent.ACTION_SHUTDOWN); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_HEADSET_PLUG); +/* Vanzo:tanglei on: Fri, 13 Mar 2015 21:22:01 +0800 + */ + //if (FeatureOption.VANZO_FEATURE_EARPHONE_KEY_ACTION) { + // filter.addAction("com.mediatek.FMRadio.FMRadioService.NEXT_STATION"); + //} +// End of Vanzo:tanglei + filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); + filter.addAction(ACTION_TOFMSERVICE_POWERDOWN); + filter.addAction(ACTION_FROMATVSERVICE_POWERUP); + mBroadcastReceiver = new FmServiceBroadcastReceiver(); + Log.i(TAG, "Register broadcast receiver."); + registerReceiver(mBroadcastReceiver, filter); + } + + private void unregisterFmBroadcastReceiver() { + if (null != mBroadcastReceiver) { + Log.i(TAG, "Unregister broadcast receiver."); + unregisterReceiver(mBroadcastReceiver); + mBroadcastReceiver = null; + } + } + + @Override + public void onDestroy() { + Log.d(TAG, ">>> FmRadioService.onDestroy"); + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + // stop rds first, avoid blocking other native method + if (isRdsSupported()) { + Log.d(TAG, "RDS is supported. Stop the RDS thread."); + stopRdsThread(); + } + unregisterFmBroadcastReceiver(); + unregisterSdcardListener(); + abandonAudioFocus(); + exitFm(); + if (null != mFmRecorder) { + mFmRecorder = null; + } + super.onDestroy(); + } + + /** + * Exit FMRadio application + */ + private void exitFm() { + Log.d(TAG, "service.exitFm start"); + mIsAudioFocusHeld = false; + // Stop FM recorder if it is working + if (null != mFmRecorder) { + synchronized (mStopRecordingLock) { + int fmState = mFmRecorder.getState(); + if (FmRecorder.STATE_PLAYBACK == fmState) { + mFmRecorder.stopPlayback(); + Log.d(TAG, "Stop playback FMRecorder."); + } else if (FmRecorder.STATE_RECORDING == fmState) { + mFmRecorder.stopRecording(); + Log.d(TAG, "stop Recording."); + } + + // ALPS01789667 Add to DB if exit, there are two cases: + // case 1: FileManager play Music->FM receive short audio focus->Fm stop recording + // -> FM receive SOUND_POWER_DOWN_MSG->Come here but is IDLE status + // case 2: Music play a song->FM receive long audio focus->Come here is RECORDING + mFmRecorder.addCurrentRecordingToDb(mContext); + } + } + + // When exit, we set the audio path back to earphone. + if (mIsNativeScanning || mIsNativeSeeking) { + stopScan(); + } + + mFmServiceHandler.removeCallbacksAndMessages(null); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_FM_EXIT); + mFmServiceHandler.sendEmptyMessage(FmRadioListener.MSGID_FM_EXIT); + Log.d(TAG, "service.exitFm end"); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Change the notification string. + if (mIsPowerUp) { + showNotification(); + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d(TAG, ">>> FmRadioService.onStartCommand intent: " + intent + " startId: " + startId); + int ret = super.onStartCommand(intent, flags, startId); + Log.d(TAG, "<<< FmRadioService.onStartCommand: " + ret); + return START_NOT_STICKY; + } + + /** + * Start RDS thread to update RDS information + */ + private void startRdsThread() { + Log.d(TAG, ">>> FmRadioService.startRdSThread"); + mIsRdsThreadExit = false; + if (null != mRdsThread) { + return; + } + mRdsThread = new Thread() { + public void run() { + Log.d(TAG, ">>> RDS Thread run()"); + while (true) { + if (mIsRdsThreadExit) { + break; + } + + int iRdsEvents = FmRadioNative.readRds(); + if (iRdsEvents != 0) { + Log.d(TAG, "FmRadioNative.readrds events: " + iRdsEvents); + } + + if (RDS_EVENT_PROGRAMNAME == (RDS_EVENT_PROGRAMNAME & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_PROGRAMNAME"); + byte[] bytePS = FmRadioNative.getPs(); + if (null != bytePS) { + setPS(new String(bytePS).trim()); + } + } + + if (RDS_EVENT_LAST_RADIOTEXT == (RDS_EVENT_LAST_RADIOTEXT & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_LAST_RADIOTEXT"); + byte[] byteLRText = FmRadioNative.getLrText(); + if (null != byteLRText) { + setLRText(new String(byteLRText).trim()); + } + } + + if (RDS_EVENT_AF == (RDS_EVENT_AF & iRdsEvents)) { + Log.d(TAG, "RDS_EVENT_AF"); + /* + * add for rds AF + */ + if (mIsScanning || mIsSeeking) { + Log.d(TAG, "RDSThread. seek or scan going, no need to tune here"); + } else if (!mIsPowerUp) { + Log.d(TAG, "RDSThread. fm is power down, do nothing."); + } else { + int iFreq = FmRadioNative.activeAf(); + if (FmRadioUtils.isValidStation(iFreq)) { + // if the new frequency is not equal to current + // frequency. + if (mCurrentStation == iFreq) { + Log.w(TAG, "RDSThread. the new freq is the same as current."); + } else { + setPS(""); + setLRText(""); + if (!mIsScanning && !mIsSeeking) { + Log.d(TAG, "RDSThread. seek or scan not going," + + "need to tune here"); + tuneStationAsync(FmRadioUtils.computeFrequency(iFreq)); + } + } + } + } + } + // Do not handle other events. + // Sleep 500ms to reduce inquiry frequency + try { + final int hundredMillisecond = 500; + Thread.sleep(hundredMillisecond); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "<<< RDS Thread run()"); + } + }; + + Log.d(TAG, "Start RDS Thread."); + mRdsThread.start(); + Log.d(TAG, "<<< FmRadioService.startRdSThread"); + } + + /** + * Stop RDS thread to stop listen station RDS change + */ + private void stopRdsThread() { + Log.d(TAG, ">>> FmRadioService.stopRdSThread"); + if (null != mRdsThread) { + // Must call closedev after stopRDSThread. + mIsRdsThreadExit = true; + mRdsThread = null; + } + Log.d(TAG, "<<< FmRadioService.stopRdSThread"); + } + + /** + * Set PS information + * + * @param ps The ps information + */ + private void setPS(String ps) { + Log.d(TAG, "FmRadioService.setPS: " + ps + " ,current: " + mPSString); + if (0 != mPSString.compareTo(ps)) { + mPSString = ps; + Bundle bundle = new Bundle(3); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_PS_CHANGED); + bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString); + bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString); + notifyActivityStateChanged(bundle); + } // else New PS is the same as current + } + + /** + * Set RT information + * + * @param lrtText The RT information + */ + private void setLRText(String lrtText) { + Log.d(TAG, "FmRadioService.setLRText: " + lrtText + " ,current: " + mLRTextString); + if (0 != mLRTextString.compareTo(lrtText)) { + mLRTextString = lrtText; + Bundle bundle = new Bundle(3); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RT_CHANGED); + bundle.putString(FmRadioListener.KEY_PS_INFO, mPSString); + bundle.putString(FmRadioListener.KEY_RT_INFO, mLRTextString); + notifyActivityStateChanged(bundle); + } // else New RT is the same as current + } + + /** + * Open or close FM Radio audio + * + * @param enable true, open FM audio; false, close FM audio; + */ + private void enableFmAudio(boolean enable) { + Log.d(TAG, ">>> FmRadioService.enableFmAudio: " + enable); + if ((mFmPlayer == null) || !mIsPowerUp) { + Log.w(TAG, "mFMPlayer is null in Service.enableFmAudio"); + return; + } + + try { + if (!enable) { + if (!mFmPlayer.isPlaying()) { + Log.d(TAG, "warning: FM audio is already disabled."); + return; + } + + Log.d(TAG, "call MediaPlayer.stop()"); + mFmPlayer.stop(); + Log.d(TAG, "stop FM audio."); + return; + } + + if (mFmPlayer.isPlaying()) { + Log.d(TAG, "warning: FM audio is already enabled."); + return; + } + } catch (IllegalStateException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer isPlaying.", e); + } + + try { + mFmPlayer.prepare(); + //if (FmRadioUtils.isFmSuspendSupport()) { + // Log.d(TAG, "support FM suspend"); + // mFmPlayer.startWithoutWakelock(); + //} else { + mFmPlayer.start(); + //} + } catch (IOException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e); + } catch (IllegalStateException e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare.", e); + } + + Log.d(TAG, "Start FM audio."); + Log.d(TAG, "<<< FmRadioService.enableFmAudio"); + } + + /** + * Show notification + */ + private void showNotification() { + Log.d(TAG, "FmRadioService.showNotification"); + Intent notificationIntent = new Intent(); + notificationIntent.setClassName(getPackageName(), FmRadioActivity.class.getName()); + PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), + 0, notificationIntent, 0); + Notification notification = new Notification(R.drawable.fm_title_icon, null, + System.currentTimeMillis()); + notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR; + String fmUnit = mContext.getString(R.string.fm_unit); + String text = FmRadioUtils.formatStation(mCurrentStation) + " " + fmUnit; + notification.setLatestEventInfo(getApplicationContext(), + getResources().getString(R.string.app_name), text, pendingIntent); + Log.d(TAG, "Add notification to the title bar."); + startForeground(NOTIFICATION_ID, notification); + } + + /** + * Remove notification + */ + private void removeNotification() { + Log.d(TAG, "FmRadioService.removeNotification"); + stopForeground(true); + } + + /** + * Update notification + */ + private void updateNotification() { + Log.d(TAG, "FmRadioService.updateNotification"); + if (mIsPowerUp) { + showNotification(); + } + } + + /** + * Register sdcard listener for record + */ + private void registerSdcardReceiver() { + Log.v(TAG, "registerSdcardReceiver >>> "); + if (mSdcardListener == null) { + mSdcardListener = new SdcardListener(); + } + IntentFilter filter = new IntentFilter(); + filter.addDataScheme("file"); + filter.addAction(Intent.ACTION_MEDIA_MOUNTED); + filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); + filter.addAction(Intent.ACTION_MEDIA_EJECT); + registerReceiver(mSdcardListener, filter); + Log.v(TAG, "registerSdcardReceiver <<< "); + } + + private void unregisterSdcardListener() { + if (null != mSdcardListener) { + unregisterReceiver(mSdcardListener); + } + } + + private void updateSdcardStateMap(Intent intent) { + String action = intent.getAction(); + String sdcardPath = null; + Uri mountPointUri = intent.getData(); + if (mountPointUri != null) { + sdcardPath = mountPointUri.getPath(); + if (sdcardPath != null) { + if (Intent.ACTION_MEDIA_EJECT.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: ENJECT " + sdcardPath); + mSdcardStateMap.put(sdcardPath, false); + } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: UNMOUNTED " + sdcardPath); + mSdcardStateMap.put(sdcardPath, false); + } else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { + Log.d(TAG, "updateSdcardStateMap: MOUNTED " + sdcardPath); + mSdcardStateMap.put(sdcardPath, true); + } + } + } + } + + /** + * Notify FM recorder state + * + * @param state The current FM recorder state + */ + @Override + public void onRecorderStateChanged(int state) { + Log.d(TAG, "onRecorderStateChanged: " + state); + mRecordState = state; + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDSTATE_CHANGED); + bundle.putInt(FmRadioListener.KEY_RECORDING_STATE, state); + notifyActivityStateChanged(bundle); + } + + /** + * Notify FM recorder error message + * + * @param error The recorder error type + */ + @Override + public void onRecorderError(int error) { + Log.d(TAG, "onRecorderError: " + error); + // if media server die, will not enable FM audio, and convert to + // ERROR_PLAYER_INATERNAL, call back to activity showing toast. + mRecorderErrorType = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == error) ? + FmRecorder.ERROR_PLAYER_INTERNAL : error; + + Bundle bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.LISTEN_RECORDERROR); + bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, mRecorderErrorType); + notifyActivityStateChanged(bundle); + + // if media server die, should not enable fm, otherwise je will occur. + if (FmRecorder.ERROR_PLAYER_INTERNAL == error) { + resumeFmAudio(); + } + } + + /** + * Notify play FM record file complete + */ + @Override + public void onPlayRecordFileComplete() { + Log.d(TAG, "service.onPlayRecordFileComplete"); + checkAfterPlayback(); + } + + /** + * Check and go next(play or show tips) after recorder file play + * back finish. + * Two cases: + * 1. With headset or support short antenna -> play FM + * 2. Without headset -> show plug in earphone tips + */ + private void checkAfterPlayback() { + if (isHeadSetIn() || SHORT_ANNTENNA_SUPPORT) { + // with headset + Log.d(TAG, "checkAfterPlayback:eaphone is in,need resume fm"); + if (mIsPowerUp) { + resumeFmAudio(); + setMute(false); + } else { + powerUpAsync(FmRadioUtils.computeFrequency(mCurrentStation)); + } + } else { + // without headset need show plug in earphone tips + Log.d(TAG, "checkAfterPlayback:earphone is out, need show plug in earphone tips"); + switchAntennaAsync(mValueHeadSetPlug); + } + } + + /** + * Check the headset is plug in or plug out + * + * @return true for plug in; false for plug out + */ + private boolean isHeadSetIn() { + return (0 == mValueHeadSetPlug); + } + + private void stopFmFocusLoss(int focusState) { + mIsAudioFocusHeld = false; + if (mIsNativeScanning || mIsNativeSeeking) { + // make stop scan from activity call to service. + // notifyActivityStateChanged(FMRadioListener.LISTEN_SCAN_CANCELED); + stopScan(); + Log.d(TAG, "need to stop FM, so stop scan channel."); + } + + // using handler thread to update audio focus state + updateAudioFocusAync(focusState); + Log.d(TAG, "need to stop FM, so powerdown FM."); + + } + + /** + * Handle FM Player error + */ + private final MediaPlayer.OnErrorListener mPlayerErrorListener = + new MediaPlayer.OnErrorListener() { + /** + * handle error message + * + * @param mp occurred error media player + * @param what error message + * @param extra error message extra + * + * @return handle error message or not + */ + public boolean onError(MediaPlayer mp, int what, int extra) { + + if (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) { + Log.d(TAG, "onError: MEDIA_SERVER_DIED"); + if (null != mFmPlayer) { + mFmPlayer.release(); + mFmPlayer = null; + } + mFmPlayer = new MediaPlayer(); + if (!FmRadioUtils.isFmSuspendSupport()) { + mFmPlayer.setWakeMode(FmRadioService.this, PowerManager.PARTIAL_WAKE_LOCK); + } + mFmPlayer.setOnErrorListener(mPlayerErrorListener); + try { + mFmPlayer.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + mFmPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + if (mIsPowerUp) { + // set speaker mode according to AP + setSpeakerPhoneOn(mIsSpeakerUsed); + mFmPlayer.prepare(); + if (FmRadioUtils.isFmSuspendSupport()) { + Log.d(TAG, "support FM suspend"); + mFmPlayer.startWithoutWakelock(); + } else { + mFmPlayer.start(); + } + } + } catch (IOException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalArgumentException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return false; + } + } + + return true; + } + }; + + /** + * Request audio focus + * + * @return true, success; false, fail; + */ + public boolean requestAudioFocus() { + if (mIsAudioFocusHeld) { + return true; + } + + int audioFocus = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, + AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + mIsAudioFocusHeld = (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioFocus); + return mIsAudioFocusHeld; + } + + /** + * Abandon audio focus + */ + public void abandonAudioFocus() { + mAudioManager.abandonAudioFocus(mAudioFocusChangeListener); + mIsAudioFocusHeld = false; + } + + /** + * Use to interact with other voice related app + */ + private final OnAudioFocusChangeListener mAudioFocusChangeListener = + new OnAudioFocusChangeListener() { + /** + * Handle audio focus change ensure message FIFO + * + * @param focusChange audio focus change state + */ + @Override + public void onAudioFocusChange(int focusChange) { + Log.d(TAG, "onAudioFocusChange: " + focusChange); + switch (focusChange) { + case AudioManager.AUDIOFOCUS_LOSS: + synchronized (this) { + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS"); + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + Log.d(TAG, "onAudioFocusChange.setParameters end"); + exitFm(); + stopSelf(); + } + break; + + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + synchronized (this) { + mAudioManager.setParameters("AudioFmPreStop=1"); + setMute(true); + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT"); + stopFmFocusLoss(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); + } + break; + + case AudioManager.AUDIOFOCUS_GAIN: + synchronized (this) { + Log.d(TAG, "AudioFocus: received AUDIOFOCUS_GAIN"); + updateAudioFocusAync(AudioManager.AUDIOFOCUS_GAIN); + } + break; + + default: + Log.d(TAG, "AudioFocus: Audio focus change, but not need handle"); + break; + } + } + }; + + /** + * Audio focus changed, will send message to handler thread. synchronized to + * ensure one message can go in this method. + * + * @param focusState AudioManager state + */ + private synchronized void updateAudioFocusAync(int focusState) { + Log.d(TAG, "updateAudioFocusAync: focusState = " + focusState); + final int bundleSize = 1; + Bundle bundle = new Bundle(bundleSize); + bundle.putInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED, focusState); + Message msg = mFmServiceHandler.obtainMessage(FmRadioListener.MSGID_AUDIOFOCUS_CHANGED); + msg.setData(bundle); + mFmServiceHandler.sendMessage(msg); + } + + /** + * Audio focus changed, update FM focus state. + * + * @param focusState AudioManager state + */ + private void updateAudioFocus(int focusState) { + Log.d(TAG, "FmRadioService.updateAudioFocus"); + switch (focusState) { + case AudioManager.AUDIOFOCUS_LOSS: + mPausedByTransientLossOfFocus = false; + // play back audio will output with music audio + // May be affect other recorder app, but the flow can not be + // execute earlier, + // It should ensure execute after start/stop record. + if (mFmRecorder != null) { + int fmState = mFmRecorder.getState(); + Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState); + // only handle recorder state, not handle playback state + if (fmState == FmRecorder.STATE_RECORDING) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPRECORDING_FINISHED); + stopRecording(); + } + } + handlePowerDown(); + break; + + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + if (mIsPowerUp) { + mPausedByTransientLossOfFocus = true; + } + Log.d(TAG, "AUDIOFOCUS_LOSS_TRANSIENT: mPausedByTransientLossOfFocus:" + + mPausedByTransientLossOfFocus); + // play back audio will output with music audio + // May be affect other recorder app, but the flow can not be + // execute earlier, + // It should ensure execute after start/stop record. + if (mFmRecorder != null) { + int fmState = mFmRecorder.getState(); + Log.d(TAG, "stopFMFocusLoss.recorder state=" + fmState); + if (fmState == FmRecorder.STATE_RECORDING) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTRECORDING_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPRECORDING_FINISHED); + stopRecording(); + } + if (fmState == FmRecorder.STATE_PLAYBACK) { + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STARTPLAYBACK_FINISHED); + mFmServiceHandler.removeMessages( + FmRadioListener.MSGID_STOPPLAYBACK_FINISHED); + stopPlayback(); + } + } + handlePowerDown(); + break; + + case AudioManager.AUDIOFOCUS_GAIN: + Log.d(TAG, "AUDIOFOCUS_GAIN: mPausedByTransientLossOfFocus:" + + mPausedByTransientLossOfFocus); + if (!mIsPowerUp && mPausedByTransientLossOfFocus) { + mIsPowerUping = true; + final int bundleSize = 1; + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERUP_FINISHED); + mFmServiceHandler.removeMessages(FmRadioListener.MSGID_POWERDOWN_FINISHED); + Bundle bundle = new Bundle(bundleSize); + bundle.putFloat(FM_FREQUENCY, FmRadioUtils.computeFrequency(mCurrentStation)); + handlePowerUp(bundle); + } + break; + + default: + break; + } + } + + /** + * FM Radio listener record + */ + private static class Record { + int mHashCode; // hash code + FmRadioListener mCallback; // call back + } + + /** + * Register FM Radio listener, activity get service state should call this + * method register FM Radio listener + * + * @param callback FM Radio listener + */ + public void registerFmRadioListener(FmRadioListener callback) { + synchronized (mRecords) { + // register callback in AudioProfileService, if the callback is + // exist, just replace the event. + Record record = null; + int hashCode = callback.hashCode(); + final int n = mRecords.size(); + for (int i = 0; i < n; i++) { + record = mRecords.get(i); + if (hashCode == record.mHashCode) { + return; + } + } + record = new Record(); + record.mHashCode = hashCode; + record.mCallback = callback; + mRecords.add(record); + } + } + + /** + * Call back from service to activity + * + * @param bundle The message to activity + */ + private void notifyActivityStateChanged(Bundle bundle) { + if (!mRecords.isEmpty()) { + Log.d(TAG, "notifyActivityStatusChanged:clients = " + mRecords.size()); + synchronized (mRecords) { + Iterator<Record> iterator = mRecords.iterator(); + while (iterator.hasNext()) { + Record record = (Record) iterator.next(); + + FmRadioListener listener = record.mCallback; + + if (listener == null) { + iterator.remove(); + return; + } + + listener.onCallBack(bundle); + } + } + } + } + + /** + * Unregister FM Radio listener + * + * @param callback FM Radio listener + */ + public void unregisterFmRadioListener(FmRadioListener callback) { + remove(callback.hashCode()); + } + + /** + * Remove call back according hash code + * + * @param hashCode The call back hash code + */ + private void remove(int hashCode) { + synchronized (mRecords) { + Iterator<Record> iterator = mRecords.iterator(); + while (iterator.hasNext()) { + Record record = (Record) iterator.next(); + if (record.mHashCode == hashCode) { + iterator.remove(); + } + } + } + } + + /** + * Check recording sd card is unmount + * + * @param intent The unmount sd card intent + * + * @return true or false indicate whether current recording sd card is + * unmount or not + */ + public boolean isRecordingCardUnmount(Intent intent) { + String unmountSDCard = intent.getData().toString(); + Log.d(TAG, "unmount sd card file path: " + unmountSDCard); + return unmountSDCard.equalsIgnoreCase("file://" + sRecordingSdcard) ? true : false; + } + + private int[] insertSearchedStation(int[] channels) { + Log.d(TAG, "insertSearchedStation.firstValidChannel:" + Arrays.toString(channels)); + int firstValidChannel = mCurrentStation; + int channelNum = 0; + if (null != channels) { + Arrays.sort(channels); + int size = channels.length; + // Save searched stations into database by batch + ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); + String defaultStationName = getString(R.string.default_station_name); + for (int i = 0; i < size; i++) { + if (FmRadioUtils.isValidStation(channels[i])) { + if (0 == channelNum) { + firstValidChannel = channels[i]; + } + + if (!FmRadioStation.isFavoriteStation(mContext, channels[i])) { + ops.add(ContentProviderOperation.newInsert(Station.CONTENT_URI) + .withValue(Station.COLUMN_STATION_NAME, defaultStationName) + .withValue(Station.COLUMN_STATION_FREQ, channels[i]) + .withValue(Station.COLUMN_STATION_TYPE, + FmRadioStation.STATION_TYPE_SEARCHED) + .build()); + } + channelNum++; + } + } + // Save search stations to database by batch + try { + mContext.getContentResolver().applyBatch(FmRadioStation.AUTHORITY, ops); + } catch (RemoteException e) { + Log.d(TAG, "Exception when applyBatch searched stations " + e); + } catch (OperationApplicationException e) { + Log.d(TAG, "Exception when applyBatch searched stations " + e); + } + } + Log.d(TAG, "insertSearchedStation.firstValidChannel:" + firstValidChannel + + ",channelNum:" + channelNum); + return (new int[] { + firstValidChannel, channelNum + }); + } + + /** + * The background handler + */ + class FmRadioServiceHandler extends Handler { + public FmRadioServiceHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + Bundle bundle; + boolean isPowerup = false; + boolean isSwitch = true; + + switch (msg.what) { + + // power up + case FmRadioListener.MSGID_POWERUP_FINISHED: + bundle = msg.getData(); + handlePowerUp(bundle); + break; + + // power down + case FmRadioListener.MSGID_POWERDOWN_FINISHED: + handlePowerDown(); + break; + + // fm exit + case FmRadioListener.MSGID_FM_EXIT: + if (mIsSpeakerUsed) { + setSpeakerPhoneOn(false); + } + powerDown(); + closeDevice(); + // Release FM player upon exit + if (null != mFmPlayer) { + mFmPlayer.release(); + mFmPlayer = null; + } + + bundle = new Bundle(1); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_FM_EXIT); + notifyActivityStateChanged(bundle); + // Finish favorite when exit FM + if (sExitListener != null) { + sExitListener.onExit(); + } + break; + + // switch antenna + case FmRadioListener.MSGID_SWITCH_ANNTENNA: + bundle = msg.getData(); + int value = bundle.getInt(FmRadioListener.SWITCH_ANNTENNA_VALUE); + + // if not support short antenna, just notify, not need to switch antenna. + if (SHORT_ANNTENNA_SUPPORT) { + isSwitch = (switchAntenna(value) == 0) ? true : false; + Log.d(TAG, "FmServiceHandler.switch anntenna:isSwitch:" + isSwitch); + } else { + // if ear phone insert, need dismiss plugin earphone + // dialog + // if earphone plug out and it is not play recorder + // state, show plug dialog. + if (0 == value) { + Log.d(TAG, "FmServiceHandler.switch anntenna:dismiss dialog"); + // powerUpAsync(FMRadioUtils.computeFrequency(mCurrentStation)); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, true); + notifyActivityStateChanged(bundle); + } else { + // ear phone plug out, and recorder state is not + // play recorder state, + // show dialog. + if (mRecordState != FmRecorder.STATE_PLAYBACK) { + Log.d(TAG, "FmServiceHandler.switch anntenna:show dialog"); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false); + notifyActivityStateChanged(bundle); + } + } + } + break; + + // tune to station + case FmRadioListener.MSGID_TUNE_FINISHED: + bundle = msg.getData(); + float tuneStation = bundle.getFloat(FM_FREQUENCY); + boolean isTune = tuneStation(tuneStation); + // if tune fail, pass current station to update ui + if (!isTune) { + tuneStation = FmRadioUtils.computeFrequency(mCurrentStation); + } + bundle = new Bundle(4); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_TUNE_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isTune); + bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, tuneStation); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, mIsPowerUp); + notifyActivityStateChanged(bundle); + break; + + // seek to station + case FmRadioListener.MSGID_SEEK_FINISHED: + bundle = msg.getData(); + mIsSeeking = true; + float seekStation = seekStation(bundle.getFloat(FM_FREQUENCY), + bundle.getBoolean(OPTION)); + boolean isSeekTune = false; + int station = FmRadioUtils.computeStation(seekStation); + if (FmRadioUtils.isValidStation(station)) { + isSeekTune = tuneStation(seekStation); + } + // if tune fail, pass current station to update ui + if (!isSeekTune) { + seekStation = FmRadioUtils.computeFrequency(mCurrentStation); + } + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_TUNE_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_TUNE, isSeekTune); + bundle.putFloat(FmRadioListener.KEY_TUNE_TO_STATION, seekStation); + notifyActivityStateChanged(bundle); + mIsSeeking = false; + break; + + // start scan + case FmRadioListener.MSGID_SCAN_FINISHED: + int[] channels = null; + int[] result = null; + int scanTuneStation = 0; + boolean isScan = true; + mIsScanning = true; + if (powerUpFm(FmRadioUtils.DEFAULT_STATION_FLOAT)) { + channels = startScan(); + } + + // check whether cancel scan + if ((null != channels) && channels[0] == -100) { + Log.d(TAG, "user canceled scan:channels[0]=" + channels[0]); + isScan = false; + result = new int[] { + -1, 0 + }; + } else { + result = insertSearchedStation(channels); + scanTuneStation = result[0]; + isTune = tuneStation(FmRadioUtils.computeFrequency(scanTuneStation)); + scanTuneStation = isTune ? scanTuneStation : mCurrentStation; + } + + /* + * if there is stop command when scan, so it needs to mute + * fm avoid fm sound come out. + */ + if (mIsAudioFocusHeld) { + Log.d(TAG, "there is not power down command.set mute false"); + setMute(false); + } + bundle = new Bundle(4); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.MSGID_SCAN_FINISHED); + bundle.putInt(FmRadioListener.KEY_TUNE_TO_STATION, scanTuneStation); + bundle.putInt(FmRadioListener.KEY_STATION_NUM, result[1]); + bundle.putBoolean(FmRadioListener.KEY_IS_SCAN, isScan); + notifyActivityStateChanged(bundle); + mIsScanning = false; + break; + + // audio focus changed + case FmRadioListener.MSGID_AUDIOFOCUS_CHANGED: + bundle = msg.getData(); + int focusState = bundle.getInt(FmRadioListener.KEY_AUDIOFOCUS_CHANGED); + updateAudioFocus(focusState); + break; + + case FmRadioListener.MSGID_SET_RDS_FINISHED: + bundle = msg.getData(); + setRds(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_SET_MUTE_FINISHED: + bundle = msg.getData(); + setMute(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_ACTIVE_AF_FINISHED: + activeAF(); + break; + + /********** recording **********/ + case FmRadioListener.MSGID_STARTRECORDING_FINISHED: + startRecording(); + break; + + case FmRadioListener.MSGID_STOPRECORDING_FINISHED: + stopRecording(); + break; + + case FmRadioListener.MSGID_STARTPLAYBACK_FINISHED: + boolean isStart = startPlayback(); + // Can not start play back, call back to activity. + if (!isStart) { + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, + FmRadioListener.LISTEN_RECORDERROR); + bundle.putInt(FmRadioListener.KEY_RECORDING_ERROR_TYPE, + FmRadioListener.NOT_AUDIO_FOCUS); + notifyActivityStateChanged(bundle); + } + break; + + case FmRadioListener.MSGID_STOPPLAYBACK_FINISHED: + stopPlayback(); + break; + + case FmRadioListener.MSGID_RECORD_MODE_CHANED: + bundle = msg.getData(); + setRecordingMode(bundle.getBoolean(OPTION)); + break; + + case FmRadioListener.MSGID_SAVERECORDING_FINISHED: + bundle = msg.getData(); + saveRecording(bundle.getString(RECODING_FILE_NAME)); + break; + + default: + break; + } + } + + } + + /** + * handle power down, execute power down and call back to activity. + */ + private void handlePowerDown() { + Bundle bundle; + boolean isPowerdown = powerDown(); + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERDOWN_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_DOWN, isPowerdown); + notifyActivityStateChanged(bundle); + } + + /** + * handle power up, execute power up and call back to activity. + * + * @param bundle power up frequency + */ + private void handlePowerUp(Bundle bundle) { + boolean isPowerup = false; + boolean isSwitch = true; + Log.d(TAG, "service handler power up start"); + float curFrequency = bundle.getFloat(FM_FREQUENCY); + + if (!SHORT_ANNTENNA_SUPPORT && !isAntennaAvailable()) { + Log.d(TAG, "call back to activity, earphone is not ready"); + mIsPowerUping = false; + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_SWITCH_ANNTENNA); + bundle.putBoolean(FmRadioListener.KEY_IS_SWITCH_ANNTENNA, false); + notifyActivityStateChanged(bundle); + return; + } + + if (powerUpFm(curFrequency)) { + isPowerup = startPlayFm(curFrequency); + mPausedByTransientLossOfFocus = false; + } + mIsPowerUping = false; + bundle = new Bundle(2); + bundle.putInt(FmRadioListener.CALLBACK_FLAG, FmRadioListener.MSGID_POWERUP_FINISHED); + bundle.putBoolean(FmRadioListener.KEY_IS_POWER_UP, isPowerup); + notifyActivityStateChanged(bundle); + Log.d(TAG, "service handler power up end"); + } + + /** + * check FM is foreground or background + */ + public boolean isActivityForeground() { + boolean isForeground = true; + List<RunningAppProcessInfo> appProcessInfos = mActivityManager.getRunningAppProcesses(); + for (RunningAppProcessInfo appProcessInfo : appProcessInfos) { + if (appProcessInfo.processName.equals(mContext.getPackageName())) { + int importance = appProcessInfo.importance; + Log.d(TAG, "isActivityForeground importance:" + importance); + if (importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND || + importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) { + Log.d(TAG, "isActivityForeground is foreground"); + isForeground = true; + } else { + Log.d(TAG, "isActivityForeground is background"); + isForeground = false; + } + break; + } + } + Log.d(TAG, "isActivityForeground return " + isForeground); + return isForeground; + } + + /** + * Check if current is lock task mode. If in this mode, AMS will cannot destory + * FmRadioActivity even call finish() + * Settings->Security->Screen pinning on + * @return true if current screen pinning on FmRadioActivity + */ + public boolean isInLockTaskMode() { + Log.d(TAG, "isInLockTaskMode:" + mActivityManager.isInLockTaskMode()); + return mActivityManager.isInLockTaskMode(); + } + + /** + * Get the recording sdcard path when staring record + * + * @return sdcard path like "/storage/sdcard0" + */ + public static String getRecordingSdcard() { + return sRecordingSdcard; + } + + /** + * The listener interface for exit + */ + public interface OnExitListener { + /** + * When Service finish, should notify FmRadioFavorite to finish + */ + void onExit(); + } + + /** + * Register the listener for exit + * + * @param listener The listener want to know the exit event + */ + public static void registerExitListener(OnExitListener listener) { + sExitListener = listener; + } + + /** + * Unregister the listener for exit + * + * @param listener The listener want to know the exit event + */ + public static void unregisterExitListener(OnExitListener listener) { + sExitListener = null; + } + + /** + * Get the latest recording name the show name in save dialog but saved in + * service + * + * @return The latest recording name or null for not modified + */ + public String getModifiedRecordingName() { + Log.d(TAG, "getRecordingNameInDialog:" + mModifiedRecordingName); + return mModifiedRecordingName; + } + + /** + * Set the latest recording name if modify the default name + * + * @param name The latest recording name or null for not modified + */ + public void setModifiedRecordingName(String name) { + Log.d(TAG, "setRecordingNameInDialog:" + name); + mModifiedRecordingName = name; + } + + /** + * When FmRadioActivity.onStop() set true, FmRadioActivity.onResume() set false; + * @param stop + */ + public static void setActivityIsOnStop(boolean stop) { + sActivityIsOnStop = stop; + } + + /** + * Check current is in call/ringtone or not + * @return true if is not call mode. false mean is in call or ringtone + */ + public boolean isModeNormal() { + int mode = mAudioManager.getMode(); + Log.d(TAG, "isInCall mode:" + mode); + return mode == AudioManager.MODE_NORMAL; + } + + // FM Radio EM start + /** + * Inquiry if fm stereo mono(true, stereo; false mono) + * + * @return (true, stereo; false, mono) + */ + public boolean getStereoMono() { + Log.d(TAG, "FMRadioService.getStereoMono"); + return FmRadioNative.stereoMono(); + } + + /** + * Force set to stero/mono mode + * + * @param isMono + * (true, mono; false, stereo) + * @return (true, success; false, failed) + */ + public boolean setStereoMono(boolean isMono) { + Log.d(TAG, "FMRadioService.setStereoMono: isMono=" + isMono); + return FmRadioNative.setStereoMono(isMono); + } + + /** + * set RSSI, desense RSSI, mute gain soft + * @param index flag which will execute + * (0:rssi threshold,1:desense rssi threshold,2: SGM threshold) + * @param value send to native + * @return execute ok or not + */ + public boolean setEmth(int index, int value) { + Log.d(TAG, ">>> FMRadioService.setEmth: index=" + index + ",value=" + value); + boolean isOk = FmRadioNative.emsetth(index, value); + Log.d(TAG, "<<< FMRadioService.setEmth: isOk=" + isOk); + return isOk; + } + + /** + * send variables to native, and get some variables return. + * @param val send to native + * @return get value from native + */ + public short[] emcmd(short[] val) { + Log.d(TAG, ">>FMRadioService.emcmd: val=" + val); + short[] shortCmds = null; + shortCmds = FmRadioNative.emcmd(val); + Log.d(TAG, "<<FMRadioService.emcmd:" + shortCmds); + return shortCmds; + } + + /** + * Get hardware version not need async + */ + public int[] getHardwareVersion() { + return FmRadioNative.getHardwareVersion(); + } + + /** + * Read cap array method not need async + */ + public int getCapArray() { + Log.d(TAG, "FMRadioService.readCapArray"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readCapArray(); + } + + /** + * Get rssi not need async + */ + public int getRssi() { + Log.d(TAG, "FMRadioService.readRssi"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readRssi(); + } + + /** + * read rds bler not need async + */ + public int getRdsBler() { + Log.d(TAG, "FMRadioService.readRdsBler"); + if (!mIsPowerUp) { + Log.w(TAG, "FM is not powered up"); + return -1; + } + return FmRadioNative.readRdsBler(); + } + // FM Radio EM end + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java new file mode 100755 index 0000000..7e24db2 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioStation.java @@ -0,0 +1,524 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.BaseColumns; +import android.util.Log; + +/** + * This class provider interface to operator databases, use by activity and + * service + */ +public class FmRadioStation { + private static final String TAG = "FmRx/Station"; + // authority use composite content provider uri + public static final String AUTHORITY = "com.mediatek.fmradio.FmRadioContentProvider"; + // use to composite content provider uri + public static final String STATION = "station"; + // default current station name + private static final String CURRENT_STATION_NAME = "FmDfltSttnNm"; + + // Default RDS settings + // PS RT whether open + private static final boolean DEFAULT_PSRT_ENABLED = false; + // AF whether open + private static final boolean DEFAULT_AF_ENABLED = false; + // TA whether open + private static final boolean DEFAULT_TA_ENABLED = false; + + // Station types. + public static final int STATION_TYPE_CURRENT = 1; + public static final int STATION_TYPE_FAVORITE = 2; + public static final int STATION_TYPE_SEARCHED = 3; + // just use to save rds, not really station type + private static final int STATION_TYPE_RDS_SETTING = 4; + + // RDS setting items + // save PSRT set + public static final int RDS_SETTING_FREQ_PSRT = 1; + // save AF set + public static final int RDS_SETTING_FREQ_AF = 2; + // save TA set + public static final int RDS_SETTING_FREQ_TA = 3; + // RDS setting values for every item + public static final String RDS_SETTING_VALUE_ENABLED = "ENABLED"; + public static final String RDS_SETTING_VALUE_DISABLED = "DISABLED"; + + // stationList table in database columns + static final String COLUMNS[] = new String[] { + Station._ID, + Station.COLUMN_STATION_NAME, + Station.COLUMN_STATION_FREQ, + // Use this type to identify different stations. + Station.COLUMN_STATION_TYPE + }; + + /** + * This class provider the columns of StationList table + */ + public static final class Station implements BaseColumns { + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + STATION); + // Extra columns of the table: COLUMN_STATION_NAME COLUMN_STATION_FREQ + // COLUMN_STATION_TYPE + public static final String COLUMN_STATION_NAME = "COLUMN_STATION_NAME"; + public static final String COLUMN_STATION_FREQ = "COLUMN_STATION_FREQ"; + public static final String COLUMN_STATION_TYPE = "COLUMN_STATION_TYPE"; + } + + /** + * Init FM database for current station and RDS setting + * + * @param context The context + */ + public static void initFmDatabase(Context context) { + // Init current station, if no current station in database, set to be + // FIXED_STATION_FREQ + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_FREQ + }, + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(STATION_TYPE_CURRENT) + }, + null); + if (null != cur) { + try { + if (!cur.moveToFirst()) { + // Can't find current station, insert FIXED_STATION_FREQ to db + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, CURRENT_STATION_NAME); + values.put(Station.COLUMN_STATION_FREQ, FmRadioUtils.DEFAULT_STATION); + values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_CURRENT); + context.getContentResolver().insert(Station.CONTENT_URI, values); + } + } finally { + cur.close(); + } + } + + // Init PSRT, AF and TA + int[] types = new int[] { + RDS_SETTING_FREQ_PSRT, RDS_SETTING_FREQ_AF, RDS_SETTING_FREQ_TA + }; + boolean[] enables = new boolean[] { + DEFAULT_PSRT_ENABLED, + DEFAULT_AF_ENABLED, DEFAULT_TA_ENABLED + }; + for (int i = 0; i < types.length; i++) { + cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_NAME + }, + Station.COLUMN_STATION_FREQ + "=" + String.valueOf(types[i]), + null, + null); + if (null != cur) { + try { + if (!cur.moveToFirst()) { + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, enables[i] ? + RDS_SETTING_VALUE_ENABLED : RDS_SETTING_VALUE_DISABLED); + values.put(Station.COLUMN_STATION_FREQ, types[i]); + values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_RDS_SETTING); + context.getContentResolver().insert(Station.CONTENT_URI, values); + } + } finally { + cur.close(); + } + } + } + Log.d(TAG, "FmRadioStation.initFmDatabase"); + } + + /** + * Insert station information to database + * + * @param context The context + * @param stationName The station name + * @param stationFreq The station frequency + * @param stationType The station type + */ + public static void insertStationToDb(Context context, String stationName, + int stationFreq, int stationType) { + Log.d(TAG, "FmRadioStation.insertStationToDb start"); + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, stationName); + values.put(Station.COLUMN_STATION_FREQ, stationFreq); + values.put(Station.COLUMN_STATION_TYPE, stationType); + context.getContentResolver().insert(Station.CONTENT_URI, values); + Log.d(TAG, "FmRadioStation.insertStationToDb end"); + } + + /** + * Update station name, station frequency according original station + * frequency, station type + * + * @param context The context + * @param stationName The new station's name + * @param oldStationFreq The old station frequency + * @param newStationFreq The new station frequency + * @param stationType The old station type + */ + public static void updateStationToDb(Context context, String stationName, int oldStationFreq, + int newStationFreq, int stationType) { + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, stationName); + values.put(Station.COLUMN_STATION_FREQ, newStationFreq); + values.put(Station.COLUMN_STATION_TYPE, stationType); + context.getContentResolver().update( + Station.CONTENT_URI, + values, + Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(oldStationFreq), String.valueOf(stationType) + }); + Log.d(TAG, "FmRadioStation.updateStationToDb: name = " + stationName + + ", new freq = " + newStationFreq); + } + + /** + * Update station name and station type according station frequency + * + * @param context The context + * @param newStationName The station new name + * @param newStationType The station new type + * @param stationFreq The original station frequency + */ + public static void updateStationToDb(Context context, String newStationName, + int newStationType, int stationFreq) { + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, newStationName); + values.put(Station.COLUMN_STATION_FREQ, stationFreq); + values.put(Station.COLUMN_STATION_TYPE, newStationType); + context.getContentResolver().update( + Station.CONTENT_URI, + values, + Station.COLUMN_STATION_FREQ + "=? AND " + + Station.COLUMN_STATION_TYPE + "<>" + STATION_TYPE_CURRENT, + new String[] { + String.valueOf(stationFreq) + }); + Log.d(TAG, "FmRadioStation.updateStationToDb: new name = " + newStationName + + ", new freq type = " + newStationType); + } + + /** + * Delete station according station frequency and station type + * + * @param context The context + * @param stationFreq The station frequency + * @param stationType The station type + */ + public static void deleteStationInDb(Context context, int stationFreq, int stationType) { + context.getContentResolver().delete( + Station.CONTENT_URI, + Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(stationFreq), String.valueOf(stationType) + }); + Log.d(TAG, "FmRadioStation.deleteStationInDb: freq = " + stationFreq + + ", type = " + stationType); + } + + /** + * Judge a station whether exist according station frequency and station + * type + * + * @param context The context + * @param stationFreq The station frequency + * @param stationType The station type + * + * @return true or false indicate whether station is exist + */ + public static boolean isStationExist(Context context, int stationFreq, int stationType) { + Log.d(TAG, ">>> isStationExist: stationFreq=" + stationFreq + + ",stationType=" + stationType); + boolean isExist = false; + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_NAME + }, + Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(stationFreq), String.valueOf(stationType) + }, + null); + if (null != cur) { + try { + if (cur.moveToFirst()) { + // This station is exist + isExist = true; + } + } finally { + cur.close(); + } + } + Log.d(TAG, "<<< isStationExist: " + isExist); + return isExist; + } + + /** + * Judge a station whether exist according station frequency + * + * @param context The context + * @param stationFreq The station frequency + * @param stationType The station type + * + * @return true or false indicate whether station is exist + */ + public static boolean isStationExistInChList(Context context, int stationFreq) { + Log.d(TAG, ">>> isStationExist: stationFreq=" + stationFreq); + boolean isExist = false; + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_NAME + }, + Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "<>1", + new String[] { + String.valueOf(stationFreq) + }, + null); + if (null != cur) { + try { + if (cur.moveToFirst()) { + // This station is exist + isExist = true; + } + } finally { + cur.close(); + } + } + Log.d(TAG, "<<< isStationExist: " + isExist); + return isExist; + } + + /** + * Get current station from database + * + * @param context The context + * + * @return the station which station type is current + */ + public static int getCurrentStation(Context context) { + int currentStation = FmRadioUtils.DEFAULT_STATION; + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_FREQ + }, + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(STATION_TYPE_CURRENT) + }, + null); + if (null != cur) { + try { + if (cur.moveToFirst()) { + currentStation = cur.getInt(0); + if (!FmRadioUtils.isValidStation(currentStation)) { + // If current station is invalid, use default and update + // the database + currentStation = FmRadioUtils.DEFAULT_STATION; + setCurrentStation(context, currentStation); + Log.w(TAG, "current station is invalid, use default!"); + } + } + } finally { + cur.close(); + } + } + Log.d(TAG, "FmRadioStation.getCurrentStation: " + currentStation); + return currentStation; + } + + /** + * Set current station + * + * @param context The context + * @param station The station frequency + */ + public static void setCurrentStation(Context context, int station) { + Log.d(TAG, "FmRadioStation.setCurrentStation start"); + // Update current station to database. + final int size = 3; + ContentValues values = new ContentValues(size); + values.put(Station.COLUMN_STATION_NAME, CURRENT_STATION_NAME); + values.put(Station.COLUMN_STATION_FREQ, station); + values.put(Station.COLUMN_STATION_TYPE, STATION_TYPE_CURRENT); + context.getContentResolver().update( + Station.CONTENT_URI, + values, + Station.COLUMN_STATION_NAME + "=? AND " + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + CURRENT_STATION_NAME, String.valueOf(STATION_TYPE_CURRENT) + }); + Log.d(TAG, "FmRadioStation.setCurrentStation end"); + } + + /** + * Clean all stations which station type is searched + * + * @param context The context + */ + public static void cleanSearchedStations(Context context) { + Log.d(TAG, "FmRadioStation.cleanSearchedStations start"); + context.getContentResolver().delete( + Station.CONTENT_URI, + Station.COLUMN_STATION_TYPE + "=" + String.valueOf(STATION_TYPE_SEARCHED), + null); + Log.d(TAG, "FmRadioStation.cleanSearchedStations end"); + } + + /** + * Get station name according station frequency and station type + * + * @param context The context + * @param stationFreq The station frequency + * @param stationType The station type + * + * @return The station name + */ + public static String getStationName(Context context, int stationFreq, int stationType) { + Log.d(TAG, "FmRadioStation.getStationName: type = " + + stationType + ", freq = " + stationFreq); + // If can't find this station id database, return default station name + String stationName = context.getString(R.string.default_station_name); + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + new String[] { + Station.COLUMN_STATION_NAME + }, + Station.COLUMN_STATION_FREQ + "=? AND " + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(stationFreq), String.valueOf(stationType) + }, + null); + if (null != cur) { + try { + if (cur.moveToFirst()) { + stationName = cur.getString(0); + } + } finally { + cur.close(); + } + } + Log.d(TAG, "FmRadioStation.getStationName: stationName = " + stationName); + return stationName; + } + + /** + * Judge whether station is a favorite station + * + * @param context The context + * @param iStation The station frequency + * + * @return true or false indicate whether station type is favorite + */ + public static boolean isFavoriteStation(Context context, int iStation) { + return isStationExist(context, iStation, STATION_TYPE_FAVORITE); + } + + /** + * Get station count according station type + * + * @param context The context + * @param stationType The station type + * + * @return The numbers of station according station type + */ + public static int getStationCount(Context context, int stationType) { + Log.d(TAG, "FmRadioStation.getStationCount Type: " + stationType); + int stationNus = 0; + Cursor cur = context.getContentResolver().query( + Station.CONTENT_URI, + COLUMNS, + Station.COLUMN_STATION_TYPE + "=?", + new String[] { + String.valueOf(stationType) + }, + null); + if (null != cur) { + try { + stationNus = cur.getCount(); + } finally { + cur.close(); + } + } + Log.d(TAG, "FmRadioStation.getStationCount: " + stationNus); + return stationNus; + } + + /** + * Clear all station of FMRadio database + * + * @param context The application context + */ + public static void cleanAllStations(Context context) { + Uri uri = Station.CONTENT_URI; + Cursor cur = context.getContentResolver().query(uri, COLUMNS, null, null, null); + if (null != cur) { + try { + cur.moveToFirst(); + while (!cur.isAfterLast()) { + // Have find one station. + uri = ContentUris.appendId(Station.CONTENT_URI.buildUpon(), + cur.getInt(cur.getColumnIndex(Station._ID))).build(); + context.getContentResolver().delete(uri, null, null); + cur.moveToNext(); + } + } finally { + cur.close(); + } + } + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java new file mode 100755 index 0000000..71bf6a0 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRadioUtils.java @@ -0,0 +1,262 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.Context; +import android.os.Environment; +import android.os.StatFs; +import android.os.SystemProperties; +import android.os.storage.StorageManager; +import android.util.Log; + +import java.util.Locale; + +/** + * This class provider interface to compute station and frequency, get project + * string + */ +public class FmRadioUtils { + private static final String TAG = "FmRx/Utils"; + + // FM station variables + public static final int DEFAULT_STATION = 1000; + public static final float DEFAULT_STATION_FLOAT = computeFrequency(DEFAULT_STATION); + // maximum station frequency + private static final int HIGHEST_STATION = 1080; + // minimum station frequency + private static final int LOWEST_STATION = 875; + // station step + private static final int STEP = 1; + // convert rate + private static final int CONVERT_RATE = 10; + +/* Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:44:52 +0800 + * add FM FactoryMode + */ + private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state"; +// End of Vanzo:yujianpeng + // minimum storage space for record + public static final long LOW_SPACE_THRESHOLD = 512 * 1024; + // StorageManager For FM record + private static StorageManager sStorageManager = null; + // short antenna + private static final boolean IS_FM_SHORT_ANTENNA_SUPPORT = SystemProperties.getBoolean( + "ro.mtk_fm_short_antenna_support", false); + // FM suspend feature + private static final boolean IS_FM_SUSPEND_SUPPORT = SystemProperties.getBoolean( + "ro.mtk_tc1_fm_at_suspend", false); + + /** + * Whether the frequency is valid. + * + * @param station The FM station + * + * @return true if the frequency is in the valid scale, otherwise return + * false + */ + public static boolean isValidStation(int station) { + boolean isValid = (station >= LOWEST_STATION && station <= HIGHEST_STATION); + Log.v(TAG, "isValidStation: freq = " + station + ", valid = " + isValid); + return isValid; + } + + /** + * Compute increase station frequency + * + * @param station The station frequency + * + * @return station The frequency after increased + */ + public static int computeIncreaseStation(int station) { + int result = station + STEP; + if (result > HIGHEST_STATION) { + result = LOWEST_STATION; + } + return result; + } + + /** + * Compute decrease station frequency + * + * @param station The station frequency + * + * @return station The frequency after decreased + */ + public static int computeDecreaseStation(int station) { + int result = station - STEP; + if (result < LOWEST_STATION) { + result = HIGHEST_STATION; + } + return result; + } + + /** + * Compute station value with given frequency + * + * @param frequency The station frequency + * + * @return station The result value + */ + public static int computeStation(float frequency) { + return (int) (frequency * CONVERT_RATE); + } + + /** + * Compute frequency value with given station + * + * @param station The station value + * + * @return station The frequency + */ + public static float computeFrequency(int station) { + return (float) station / CONVERT_RATE; + } + + /** + * According station to get frequency string + * + * @param station for 100KZ, range 875-1080 + * + * @return string like 87.5 + */ + public static String formatStation(int station) { + float frequency = (float) station / CONVERT_RATE; + String result = String.format(Locale.ENGLISH, "%.1f", + Float.valueOf(frequency)); + return result; + } + + /** + * Get the phone storage path + * + * @return The phone storage path + */ + public static String getDefaultStoragePath() { + return Environment.getExternalStorageDirectory().getPath(); + } + + /** + * Get the default storage state + * + * @return The default storage state + */ + public static String getDefaultStorageState(Context context) { + ensureStorageManager(context); + String state = sStorageManager.getVolumeState(getDefaultStoragePath()); + Log.d(TAG, "getDefaultStorageState() return state:" + state); + return state; + } + + private static void ensureStorageManager(Context context) { + if (sStorageManager == null) { + sStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + } + } + + /** + * Get the FM play list path + * + * @param context The context + * + * @return The FM play list path + */ + public static String getPlaylistPath(Context context) { + ensureStorageManager(context); + String[] externalStoragePaths = sStorageManager.getVolumePaths(); + String path = externalStoragePaths[0] + "/Playlists/"; + return path; + } + +/* Vanzo:yujianpeng on: Fri, 30 Jan 2015 14:46:21 +0800 + * add FM FactoryMode + */ + static boolean isWiredHeadsetReallyOn() { + try { + char[] buffer = new char[8]; + java.io.FileReader file = new java.io.FileReader(HEADSET_STATE_PATH); + int len = file.read(buffer, 0, 8); + int state = Integer.valueOf((new String(buffer, 0, len)).trim()); + file.close(); + return (state == 1 || state == 2); + } catch (java.io.FileNotFoundException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } +// End of Vanzo:yujianpeng + /** + * Check if has enough space for record + * + * @param recordingSdcard The recording sdcard path + * + * @return true if has enough space for record + */ + public static boolean hasEnoughSpace(String recordingSdcard) { + boolean ret = false; + try { + StatFs fs = new StatFs(recordingSdcard); + long blocks = fs.getAvailableBlocks(); + long blockSize = fs.getBlockSize(); + long spaceLeft = blocks * blockSize; + Log.d(TAG, "hasEnoughSpace: available space=" + spaceLeft); + ret = spaceLeft > LOW_SPACE_THRESHOLD ? true : false; + } catch (IllegalArgumentException e) { + Log.e(TAG, "sdcard may be unmounted:" + recordingSdcard); + } + return ret; + } + + /** + * Check if support short antenna. If true, can play FM without headset + * @return true if support + */ + public static boolean isFmShortAntennaSupport() { + return IS_FM_SHORT_ANTENNA_SUPPORT; + } + + /** + * Check if support FM suspend feature. If true, will not aquire wakelock. + * @return true if support + */ + public static boolean isFmSuspendSupport() { + return IS_FM_SUSPEND_SUPPORT; + } + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java new file mode 100755 index 0000000..a44c15e --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecordDialogFragment.java @@ -0,0 +1,333 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.app.Activity; +import android.app.DialogFragment; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.io.File; + +/** + * The dialog fragment for save recording file + */ +public class FmRecordDialogFragment extends DialogFragment { + private static final String TAG = "FmRx/RecordDlg"; + + // save recording file button + private Button mButtonSave = null; + // discard recording file button + private Button mButtonDiscard = null; + // rename recording file edit text + private EditText mRecordingNameEditText = null; + // recording file default name + private String mDefaultRecordingName = null; + // recording file to save name + private String mRecordingNameToSave = null; + // text view which show storage warning + private TextView mStorageWarningTextView = null; + private OnRecordingDialogClickListener mListener = null; + + // The default filename need't to check whether exist + private boolean mIsNeedCheckFilenameExist = false; + // record sd card path when start recording + private String mRecordingSdcard = null; + + /** + * FM record dialog fragment, because fragment manager need empty + * constructor to instantiated this dialog fragment when configuration + * change + */ + public FmRecordDialogFragment() { + } + + /** + * FM record dialog fragment according name, should pass value recording + * file name + * + * @param defaultName The default file name in FileSystem + * @param recordingName The name in the dialog for show and save + */ + public FmRecordDialogFragment(String sdcard, String defaultName, String recordingName) { + mRecordingSdcard = sdcard; + mDefaultRecordingName = defaultName; + mRecordingNameToSave = recordingName; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (OnRecordingDialogClickListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + /** + * When onCreate Set dialog style + * + * @param savedInstanceState The save instance state + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.d(TAG, ">>onCreate() savedInstanceState:" + savedInstanceState); + setStyle(DialogFragment.STYLE_NO_TITLE, 0); + Log.d(TAG, "<<onCreate()"); + } + + /** + * Inflate view and get the operation button + * + * @param inflater The layout inflater + * @param container The view group container + * @param savedInstanceState The save instance state + * + * @return The inflater view + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fm_recorder_dialog, container, false); + mButtonSave = (Button) view.findViewById(R.id.fm_recording_btn_save); + mButtonSave.setOnClickListener(mButtonOnClickListener); + + mButtonDiscard = (Button) view.findViewById(R.id.fm_recording_btn_discard); + mButtonDiscard.setOnClickListener(mButtonOnClickListener); + + mStorageWarningTextView = (TextView) view + .findViewById(R.id.save_recording_storage_warning); + + // Set the recording edit text + mRecordingNameEditText = (EditText) view.findViewById(R.id.fm_recording_text); + return view; + } + + /** + * Set the dialog edit text and other attribute + */ + @Override + public void onResume() { + super.onResume(); + Log.d(TAG, ">>onResume()"); + + // check if storage is OK, if not enough storage, make view visible + if (!FmRadioUtils.hasEnoughSpace(mRecordingSdcard)) { + mStorageWarningTextView.setVisibility(View.VISIBLE); + } + + // have define in fm_recorder_dialog.xml length at most + // 250(maxFileLength - suffixLength) + mRecordingNameEditText.setSingleLine(true); + + if (mDefaultRecordingName != null) { + if (null != mRecordingNameToSave) { + // this case just for,fragment recreate + mRecordingNameEditText.setText(mRecordingNameToSave); + if ("".equals(mRecordingNameToSave)) { + mButtonSave.setEnabled(false); + } + } else { + mRecordingNameEditText.setText(mDefaultRecordingName); + } + + mRecordingNameEditText.selectAll(); + } + mRecordingNameEditText.setHint(getActivity().getResources().getString( + R.string.edit_recording_name_hint)); + mRecordingNameEditText.requestFocus(); + setTextChangedCallback(); + getDialog().setCanceledOnTouchOutside(false); + getDialog().getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + Log.d(TAG, "<<onResume()"); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + Log.d(TAG, ">>onSaveInstanceState()"); + super.onSaveInstanceState(outState); + } + + @Override + public void onDestroy() { + Log.d(TAG, ">>onDestroy()"); + mDefaultRecordingName = null; + mRecordingNameToSave = null; + mListener = null; + Log.d(TAG, "<<onDestroy()"); + super.onDestroy(); + } + + /** + * This method register callback and set filter to Edit, in order to make + * sure that user input is legal. The input can't be illegal filename and + * can't be too long. + */ + private void setTextChangedCallback() { + mRecordingNameEditText.addTextChangedListener(new TextWatcher() { + // not use, so don't need to implement it + @Override + public void afterTextChanged(Editable arg0) { + } + + // not use, so don't need to implement it + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + /** + * check user input whether include invalid character + */ + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + Log.d(TAG, "onTextChanged() s:" + s + ", start:" + start + + ", before:" + before + ", count:" + count); + // Filename changed, so we should check the new filename is + // whether exist. + mIsNeedCheckFilenameExist = true; + String recordName = s.toString().trim(); + // Characters not allowed by file system + if (recordName.length() <= 0 + || recordName.startsWith(".") + || recordName.matches(".*[/\\\\:*?\"<>|\t].*")) { + mButtonSave.setEnabled(false); + } else { + mButtonSave.setEnabled(true); + } + + mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim(); + Log.d(TAG, "onTextChanged mRecordingNameToSave:" + mRecordingNameToSave); + } + }); + } + + private OnClickListener mButtonOnClickListener = new OnClickListener() { + /** + * Define the button operation + */ + @Override + public void onClick(View v) { + + switch (v.getId()) { + case R.id.fm_recording_btn_save: + String msg = null; + // Check the recording name whether exist + mRecordingNameToSave = mRecordingNameEditText.getText().toString().trim(); + File recordingFolderPath = new File(mRecordingSdcard, "FM Recording"); + File recordingFileToSave = + new File(recordingFolderPath, mRecordingNameToSave + + FmRecorder.RECORDING_FILE_EXTENSION); + + // If the new name is same as default name ,need't to check! + if (mDefaultRecordingName == null) { + Log.e(TAG, "Error:recording file is not exist!"); + return; + } + if (mDefaultRecordingName.equals(mRecordingNameToSave)) { + mIsNeedCheckFilenameExist = false; + } else { + mIsNeedCheckFilenameExist = true; + } + + Log.d(TAG, "save:" + mDefaultRecordingName + "->" + mRecordingNameToSave + + ", " + mIsNeedCheckFilenameExist); + if (recordingFileToSave.exists() && mIsNeedCheckFilenameExist) { + // show a toast notification if can't renaming a file/folder + // to the same name + msg = mRecordingNameEditText.getText().toString() + " " + + getActivity().getResources().getString(R.string.already_exists); + Log.d(TAG, "file " + mRecordingNameToSave + ".ogg is already exists!"); + Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); + } else { + if (null != mListener) { + mListener.onRecordingDialogClick(mRecordingNameToSave); + } + dismissAllowingStateLoss(); + } + break; + + case R.id.fm_recording_btn_discard: + if (null != mListener) { + mListener.onRecordingDialogClick(null); + } + dismissAllowingStateLoss(); + Log.d(TAG, "Discard FM recording file. "); + break; + + default: + break; + } + } + }; + + /** + * The listener for click Save or Discard + */ + public interface OnRecordingDialogClickListener { + /** + * Record dialog click callback + * + * @param recordingName The user input recording name + */ + void onRecordingDialogClick(String recordingName); + } + + /** + * Get the latest modified recording name + * + * @return The latest modified recording name + */ + public String getRecordingNameToSave() { + return mRecordingNameToSave; + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java new file mode 100755 index 0000000..be7452c --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/FmRecorder.java @@ -0,0 +1,807 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.media.MediaPlayer; +import android.media.MediaRecorder; +import android.media.MediaScannerConnection; +import android.net.Uri; +import android.os.Environment; +import android.os.SystemClock; +import android.provider.MediaStore; +import android.text.format.DateFormat; +import android.util.Log; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * This class provider interface to recording, stop recording, save recording + * file, play recording file + */ +public class FmRecorder implements MediaPlayer.OnCompletionListener, + MediaPlayer.OnErrorListener, MediaRecorder.OnErrorListener { + private static final String TAG = "FmRx/Recorder"; + // file prefix + private static final String RECORDING_FILE_PREFIX = "FM"; + // file extensition + public static final String RECORDING_FILE_EXTENSION = ".3gpp"; + // recording file folder + private static final String FM_RECORD_FOLDER = "FM Recording"; + private static final String RECORDING_FILE_TYPE = "audio/3gpp"; + private static final String RECORDING_FILE_SOURCE = "FM Recordings"; + // error type no sdcard + public static final int ERROR_SDCARD_NOT_PRESENT = 0; + // error type sdcard not have enough space + public static final int ERROR_SDCARD_INSUFFICIENT_SPACE = 1; + // error type can't write sdcard + public static final int ERROR_SDCARD_WRITE_FAILED = 2; + // error type recorder internal error occur + public static final int ERROR_RECORDER_INTERNAL = 3; + // error type player internal error occur + public static final int ERROR_PLAYER_INTERNAL = 4; + // error type recorder state is invalid + public static final int ERROR_RECORDER_INVALID_STATE = 5; + // FM Recorder state not recording and not playing + public static final int STATE_IDLE = 5; + // FM Recorder state recording + public static final int STATE_RECORDING = 6; + // FM Recorder state playing + public static final int STATE_PLAYBACK = 7; + // FM Recorder state invalid, need to check + public static final int STATE_INVALID = -1; + + // use to record current FM recorder state + public int mInternalState = STATE_IDLE; + // the recording time after start recording + private long mRecordTime = 0; + // record start time + private long mRecordStartTime = 0; + // current record file + private File mRecordFile = null; + // record current record file is saved by user + private boolean mIsRecordingFileSaved = false; + // listener use for notify service the record state or error state + private OnRecorderStateChangedListener mStateListener = null; + // player use for play recording file + private MediaPlayer mPlayer = null; + // recorder use for record file + private MediaRecorder mRecorder = null; + + /** + * Start recording the voice of FM, also check the pre-conditions, if not + * meet, will return an error message to the caller. if can start recording + * success, will set FM record state to recording and notify to the caller + */ + public void startRecording(Context context) { + Log.d(TAG, ">> startRecording"); + mRecordTime = 0; + + // Check external storage + if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + Log.e(TAG, "No external storage available"); + setError(ERROR_SDCARD_NOT_PRESENT); + return; + } + + String recordingSdcard = FmRadioUtils.getDefaultStoragePath(); + // check whether have sufficient storage space, if not will notify + // caller error message + if (!FmRadioUtils.hasEnoughSpace(recordingSdcard)) { + setError(ERROR_SDCARD_INSUFFICIENT_SPACE); + Log.e(TAG, "SD card does not have sufficient space!!"); + return; + } + + // get external storage directory + File sdDir = new File(recordingSdcard); + Log.d(TAG, "external storage dir = " + sdDir.getAbsolutePath()); + File recordingDir = new File(sdDir, FM_RECORD_FOLDER); + // exist a file named FM Recording, so can't create FM recording folder + if (recordingDir.exists() && !recordingDir.isDirectory()) { + Log.e(TAG, "A FILE with name \"FM Recording\" already exists!!"); + setError(ERROR_SDCARD_WRITE_FAILED); + return; + } else if (!recordingDir.exists()) { // try to create recording folder + boolean mkdirResult = recordingDir.mkdir(); + if (!mkdirResult) { // create recording file failed + setError(ERROR_RECORDER_INTERNAL); + return; + } + } + // create recording temporary file + long curTime = System.currentTimeMillis(); + Date date = new Date(curTime); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH); + String time = simpleDateFormat.format(date); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(RECORDING_FILE_PREFIX).append( + "_").append(time).append(RECORDING_FILE_EXTENSION); + String name = stringBuilder.toString(); + mRecordFile = new File(recordingDir, name); + try { + if (mRecordFile.createNewFile()) { + Log.e(TAG, "createNewFile success"); + } + } catch (IOException ioex) { + Log.e(TAG, "IOException while createTempFile: " + ioex); + ioex.printStackTrace(); + setError(ERROR_SDCARD_WRITE_FAILED); + return; + } + // set record parameter and start recording + try { + Log.d(TAG, "new record file is:" + mRecordFile.getName()); + + mRecorder = new MediaRecorder(); + Log.d(TAG, "startRecording: create new media record instance"); + mRecorder.setOnErrorListener(this); + mRecorder.setAudioSource(MediaRecorder.AudioSource.FM_TUNER); + mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); + mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); + final int samplingRate = 44100; + mRecorder.setAudioSamplingRate(samplingRate); + final int bitRate = 128000; + mRecorder.setAudioEncodingBitRate(bitRate); + final int channels = 2; + mRecorder.setAudioChannels(channels); + mRecorder.setOutputFile(mRecordFile.getAbsolutePath()); + mRecorder.prepare(); + mRecordStartTime = SystemClock.elapsedRealtime(); + mRecorder.start(); + mIsRecordingFileSaved = false; + Log.d(TAG, "startRecording: start"); + } catch (IllegalStateException e) { + Log.e(TAG, "IllegalStateException while starting recording!", e); + setError(ERROR_RECORDER_INTERNAL); + return; + } catch (IOException e) { + Log.e(TAG, "IOException while starting recording!", e); + setError(ERROR_RECORDER_INTERNAL); + return; + } catch (RuntimeException e) { + Log.e(TAG, "RuntimeException while start recording", e); + setError(ERROR_RECORDER_INTERNAL); + return; + } + setState(STATE_RECORDING); + Log.d(TAG, "<< startRecording"); + } + + /** + * Stop recording, compute recording time and update FM recorder state + */ + public void stopRecording() { + Log.d(TAG, ">> stopRecording"); + if (STATE_RECORDING != mInternalState) { + Log.w(TAG, "stopRecording() called in wrong state!!"); + return; + } + + mRecordTime = SystemClock.elapsedRealtime() - mRecordStartTime; + stopRecorder(); + setState(STATE_IDLE); + Log.d(TAG, "<< stopRecording"); + } + + /** + * Play current recorded file, if failed notify error message to caller, if + * success update FM recorder state + */ + public void startPlayback() { + Log.d(TAG, ">> startPlayback"); + if (null == mRecordFile) { + Log.e(TAG, "no file to playback!"); + return; + } + + mPlayer = new MediaPlayer(); + try { + mPlayer.setDataSource(mRecordFile.getAbsolutePath()); + Log.d(TAG, "MediaPlayer.setDataSource(" + mRecordFile.getAbsolutePath() + ")"); + mPlayer.setOnCompletionListener(this); + mPlayer.setOnErrorListener(this); + mPlayer.prepare(); + Log.d(TAG, "MediaPlayer.prepare()"); + mPlayer.start(); + } catch (IOException e) { + Log.e(TAG, "Exception while trying to playback recording file: " + e); + setError(ERROR_PLAYER_INTERNAL); + return; + } catch (IllegalArgumentException e) { + Log.e(TAG, "Exception while trying to playback recording file: " + e); + setError(ERROR_PLAYER_INTERNAL); + return; + } catch (SecurityException e) { + Log.e(TAG, "Exception while trying to playback recording file: " + e); + setError(ERROR_PLAYER_INTERNAL); + return; + } catch (IllegalStateException e) { + Log.e(TAG, "Exception while trying to playback recording file: " + e); + setError(ERROR_PLAYER_INTERNAL); + return; + } + setState(STATE_PLAYBACK); + Log.d(TAG, "<< startPlayback"); + } + + /** + * Stop playing the current recording file, and update FM recorder state + */ + public void stopPlayback() { + Log.d(TAG, ">> stopPlayback"); + if (null == mPlayer || STATE_PLAYBACK != mInternalState || + (null != mPlayer && !mPlayer.isPlaying())) { + Log.w(TAG, "stopPlayback called in wrong state!!"); + // need call back to update button status + setState(STATE_IDLE); + return; + } + stopPlayer(); + setState(STATE_IDLE); + Log.d(TAG, "<< stopPlayback"); + } + + /** + * Compute the current record time + * + * @return The current record time + */ + public long recordTime() { + if (STATE_RECORDING == mInternalState) { + mRecordTime = SystemClock.elapsedRealtime() - mRecordStartTime; + } + return mRecordTime; + } + + /** + * Get FM recorder current state + * + * @return FM recorder current state + */ + public int getState() { + return mInternalState; + } + + /** + * Get current recording file name + * + * @return The current recording file name + */ + public String getRecordingName() { + if (null != mRecordFile) { + String fileName = mRecordFile.getName(); + if (fileName.toLowerCase().endsWith(RECORDING_FILE_EXTENSION) + && fileName.length() > RECORDING_FILE_EXTENSION.length()) { + // remove the extension sub string first + fileName = fileName.substring(0, fileName.length() - + RECORDING_FILE_EXTENSION.length()); + } + return fileName; + } + return null; + } + + /** + * Get current recording file name with full path + * + * @return The current recording file name with path + */ + public String getRecordingNameWithPath() { + if (null != mRecordFile) { + String fileName = mRecordFile.getAbsolutePath(); + if (fileName.toLowerCase().endsWith(RECORDING_FILE_EXTENSION) + && fileName.length() > RECORDING_FILE_EXTENSION.length()) { + // remove the extension sub string first + fileName = fileName.substring(0, fileName.length() - + RECORDING_FILE_EXTENSION.length()); + } + Log.d(TAG, "getRecordingNameWithPath: fileName is " + fileName); + return fileName; + } + return null; + } + + /** + * Save recording with the given name, and save recording file info to + * database + * + * @param context The context + * @param newName The name to override default recording name + */ + public void saveRecording(Context context, String newName) { + Log.d(TAG, ">> saveRecording(" + newName + ")"); + if (null == mRecordFile) { + Log.e(TAG, "<< saveRecording: recording file is null!"); + return; + } + + File parentFile = mRecordFile.getParentFile(); + if (null == parentFile) { + Log.e(TAG, "<< saveRecording: parent recording file is null!"); + return; + } + + // rename the recording file with given name + if (null != newName && !newName.equals(getRecordingName())) { + File sdFile = new File(parentFile.getPath(), + newName + RECORDING_FILE_EXTENSION); + if (sdFile.exists()) { + Log.w(TAG, "A file with the same new name will be deleted: " + + sdFile.getAbsolutePath()); + if (!sdFile.delete()) { + Log.e(TAG, "can't delete the file already exits"); + } + } + if (null != parentFile) { + if (!mRecordFile.renameTo(new File(parentFile.getPath(), + newName + RECORDING_FILE_EXTENSION))) { + Log.e(TAG, "can't rename file, use default name to save"); + newName = getRecordingName(); + } + mRecordFile = new File(parentFile.getPath(), + newName + RECORDING_FILE_EXTENSION); + } + } + mIsRecordingFileSaved = true; + // save recording file info to database + addCurrentRecordingToDb(context); + Log.d(TAG, "<< saveRecording(" + newName + ")"); + } + + /** + * Discard current recording file, release recorder and player + */ + public void discardRecording() { + Log.d(TAG, ">> discardRecording"); + // release recorder + if ((STATE_RECORDING == mInternalState) && (null != mRecorder)) { + stopRecorder(); + // release player + } else if ((STATE_PLAYBACK == mInternalState) && (null != mPlayer)) { + stopPlayer(); + } + + if (null != mRecordFile && !mIsRecordingFileSaved) { + if (!mRecordFile.delete()) { + // deletion failed, possibly due to hot plug out SD card + Log.d(TAG, "discardRecording: deletion failed!"); + } + mRecordFile = null; + mRecordStartTime = 0; + mRecordTime = 0; + } + setState(STATE_IDLE); + Log.d(TAG, "<< discardRecording"); + } + + /** + * Set the callback use to notify FM recorder state and error message + * + * @param listener the callback + */ + public void registerRecorderStateListener(OnRecorderStateChangedListener listener) { + mStateListener = listener; + } + + /** + * Interface to notify FM recorder state and error message + */ + public interface OnRecorderStateChangedListener { + /** + * notify FM recorder state + * + * @param state current FM recorder state + */ + void onRecorderStateChanged(int state); + + /** + * notify FM recorder error message + * + * @param error error type + */ + void onRecorderError(int error); + + /** + * notify play FM record file complete + */ + void onPlayRecordFileComplete(); + } + + /** + * When complete current recording file, release player and update FM + * recorder state to idle + * + * @param mp The current player + */ + @Override + public void onCompletion(MediaPlayer mp) { + Log.d(TAG, ">> MediaPlayer.onCompletion"); + synchronized (this) { + if (null != mPlayer) { + mPlayer.stop(); + mPlayer.release(); + mPlayer = null; + } + } + setState(STATE_IDLE); + if (null != mStateListener) { + mStateListener.onPlayRecordFileComplete(); + } + Log.d(TAG, "<< MediaPlayer.onCompletion"); + } + + /** + * If player occur error, release player, notify error message, update FM + * recorder state to idle + * + * @param mp The current player + * @param what The error message type + * @param extra The error message extra + * @return true or false indicate handle this error or not + */ + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + Log.e(TAG, "MediaPlayer.onError: what=" + what + ", extra=" + extra); + int error = (MediaPlayer.MEDIA_ERROR_SERVER_DIED == what) ? what : ERROR_PLAYER_INTERNAL; + setError(error); + synchronized (this) { + if (null != mPlayer) { + mPlayer.release(); + mPlayer = null; + } + } + if (STATE_PLAYBACK == mInternalState) { + setState(STATE_IDLE); + } + return true; + } + + /** + * When recorder occur error, release player, notify error message, and + * update FM recorder state to idle + * + * @param mr The current recorder + * @param what The error message type + * @param extra The error message extra + */ + @Override + public void onError(MediaRecorder mr, int what, int extra) { + Log.e(TAG, "MediaRecorder.onError: what=" + what + ", extra=" + extra); + stopRecorder(); + setError(ERROR_RECORDER_INTERNAL); + if (STATE_RECORDING == mInternalState) { + setState(STATE_IDLE); + } + } + + /** + * Reset FM recorder + */ + public void resetRecorder() { + if (mRecorder != null) { + mRecorder.release(); + mRecorder = null; + } + if (mPlayer != null) { + mPlayer.release(); + mPlayer = null; + } + mRecordFile = null; + mRecordStartTime = 0; + mRecordTime = 0; + mInternalState = STATE_IDLE; + } + + /** + * Notify error message to the callback + * + * @param error FM recorder error type + */ + private void setError(int error) { + Log.e(TAG, "setError: " + error); + if (null != mStateListener) { + mStateListener.onRecorderError(error); + } + } + + /** + * Notify FM recorder state message to the callback + * + * @param state FM recorder current state + */ + private void setState(int state) { + mInternalState = state; + if (null != mStateListener) { + mStateListener.onRecorderStateChanged(state); + } + } + + /** + * Save recording file info to database + * + * @param context application context + */ + public void addCurrentRecordingToDb(final Context context) { + Log.v(TAG, ">> addCurrentRecordingToDb"); + if (null == mRecordFile || !mRecordFile.exists()) { + Log.e(TAG, "<< addCurrentRecordingToDb: file does not exists"); + return; + } + long curTime = System.currentTimeMillis(); + long modDate = mRecordFile.lastModified(); + Date date = new Date(curTime); + +// java.text.DateFormat dateFormatter = DateFormat.getDateFormat(context); +// java.text.DateFormat timeFormatter = DateFormat.getTimeFormat(context); + String title = getRecordingName(); +// StringBuilder stringBuilder = new StringBuilder(); +// stringBuilder.append(FM_RECORD_FOLDER).append(" ").append( +// dateFormatter.format(date)).append(" ").append( +// timeFormatter.format(date)); +// String artist = stringBuilder.toString(); + + final int size = 8; + ContentValues cv = new ContentValues(size); + cv.put(MediaStore.Audio.Media.IS_MUSIC, 1); + cv.put(MediaStore.Audio.Media.TITLE, title); + cv.put(MediaStore.Audio.Media.DATA, mRecordFile.getAbsolutePath()); + final int oneSecond = 1000; + cv.put(MediaStore.Audio.Media.DATE_ADDED, (int) (curTime / oneSecond)); + cv.put(MediaStore.Audio.Media.DATE_MODIFIED, (int) (modDate / oneSecond)); + cv.put(MediaStore.Audio.Media.MIME_TYPE, RECORDING_FILE_TYPE); +// cv.put(MediaStore.Audio.Media.ARTIST, artist); + cv.put(MediaStore.Audio.Media.ALBUM, RECORDING_FILE_SOURCE); + cv.put(MediaStore.Audio.Media.DURATION, mRecordTime); + + int recordingId = addToMediaDB(context, cv); + if (-1 == recordingId) { + // insert failed + return; + } + int playlistId = getPlaylistId(context); + if (-1 == playlistId) { + // play list not exist, create FM Recording play list + playlistId = createPlaylist(context); + } + if (-1 == playlistId) { + // insert playlist failed + return; + } + // insert item to FM recording play list + addToPlaylist(context, playlistId, recordingId); + // Notify applications listening to the scanner events that + // a recorded audio file just created. + // Connect to mediascanner to update duration + MediaScannerConnection.scanFile(context, + new String[] { + mRecordFile.getAbsolutePath() + }, null, null); + } + + private int getPlaylistId(final Context context) { + Cursor playlistCursor = context.getContentResolver().query( + MediaStore.Audio.Playlists.getContentUri("external"), + new String[] { + MediaStore.Audio.Playlists._ID + }, + MediaStore.Audio.Playlists.DATA + "=?", + new String[] { + FmRadioUtils.getPlaylistPath(context) + RECORDING_FILE_SOURCE + }, + null); + int playlistId = -1; + if (null != playlistCursor) { + try { + if (playlistCursor.moveToFirst()) { + playlistId = playlistCursor.getInt(0); + } + } finally { + playlistCursor.close(); + } + } + return playlistId; + } + + private int createPlaylist(final Context context) { + final int size = 1; + ContentValues cv = new ContentValues(size); + cv.put(MediaStore.Audio.Playlists.NAME, RECORDING_FILE_SOURCE); + Log.d(TAG, "addToPlaylist: insert playlist"); + Uri newPlaylistUri = context.getContentResolver().insert( + MediaStore.Audio.Playlists.getContentUri("external"), cv); + if (newPlaylistUri == null) { + Log.d(TAG, "createPlaylist: insert failed"); + return -1; + } + return Integer.valueOf(newPlaylistUri.getLastPathSegment()); + } + + private int addToMediaDB(final Context context, final ContentValues cv) { + Uri insertResult = null; + int recordingId = -1; + + Cursor existItems = context.getContentResolver().query( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + new String[] { + "_id" + }, + MediaStore.Audio.Media.DATA + "=?", + new String[] { + mRecordFile.getAbsolutePath() + }, + null); + + if (null != existItems) { + try { + + if (existItems.moveToFirst()) { + // there's already a file with the same name in DB, update + // the item. + recordingId = existItems.getInt(0); + Log.d(TAG, "existing items update recording id" + recordingId); + int rowCnt = context.getContentResolver().update( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + cv, + MediaStore.Audio.Media.DATA + "=?", + new String[] { + mRecordFile.getAbsolutePath() + }); + + } else { + // not exist file has a same name in DB, insert the item. + Log.d(TAG, "addToMediaDB: insert data"); + insertResult = context.getContentResolver().insert( + MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); + if (null != insertResult) { + recordingId = Integer.valueOf(insertResult.getLastPathSegment()); + } + } + } finally { + existItems.close(); + existItems = null; + } + } + return recordingId; + } + + private void addToPlaylist(final Context context, final int playlistId, final int recordingId) { + if (-1 == playlistId) { + return; + } + Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); + Cursor itemInMembers = context.getContentResolver().query(membersUri, + new String[] { + MediaStore.Audio.Playlists.Members.AUDIO_ID + }, + MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?", + new String[] { + String.valueOf(recordingId) + }, null); + if (null != itemInMembers) { + try { + if (itemInMembers.moveToFirst()) { + // Item already in playlist member, + // no further actions (modify play_order is difficult, + // since a same audio_id can appear multiple times in one + // playlist + // with different play_order) + Log.d(TAG, "addToPlaylist new item already in playlists.members table"); + return; + } + } finally { + itemInMembers.close(); + itemInMembers = null; + } + } + Log.d(TAG, "addToPlaylist: query members"); + Cursor membersCursor = context.getContentResolver().query( + membersUri, + new String[] { + "count(*)" + }, + null, + null, + null); + + if (null != membersCursor) { + try { + if (membersCursor.moveToFirst()) { + // insert item to playlist + int base = membersCursor.getInt(0); + final int size = 2; + ContentValues cv = new ContentValues(size); + cv.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base)); + cv.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, recordingId); + Log.d(TAG, "addToPlaylist: insert to members"); + context.getContentResolver().insert(membersUri, cv); + } + } finally { + membersCursor.close(); + membersCursor = null; + } + } + } + + private void stopRecorder() { + synchronized (this) { + if (null != mRecorder) { + try { + mRecorder.stop(); + Log.d(TAG, "stopRecorder: stop"); + } catch (IllegalStateException ex) { + Log.e(TAG, "IllegalStateException ocurr" + ex); + setError(ERROR_RECORDER_INTERNAL); + } catch (RuntimeException exception) { + // modified for stop recording failed. + // native recorder will throw runtime exception such as + // in case of start recording and stop it immediately + Log.e(TAG, "RuntimeException ocurr" + exception); + setError(ERROR_RECORDER_INTERNAL); + } finally { + mRecorder.release(); + Log.d(TAG, "stopRecorder: release"); + mRecorder = null; + } + } + } + } + + private void stopPlayer() { + synchronized (this) { + if (null != mPlayer) { + try { + mPlayer.stop(); + } catch (IllegalStateException e) { + Log.e(TAG, "IllegalStateException while discard recording!"); + setError(ERROR_PLAYER_INTERNAL); + return; + } finally { + mPlayer.release(); + mPlayer = null; + } + } + } + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java new file mode 100755 index 0000000..accd31d --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java @@ -0,0 +1,168 @@ +package com.mediatek.fmradio; + +import android.app.Activity; +import android.content.Intent; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +import java.io.IOException; +/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:04:11 +0800 + * force use speaker + */ +//import com.android.featureoption.FeatureOption; +// End of Vanzo:fenghaitao +public class TestFM extends Activity implements OnClickListener { + + public static final String TAG = "FM radio service"; + /* Vanzo:zhuhandong on: Fri, 27 Apr 2015 15:57:27 +0800 + * here to user speaker + * private static final int FOR_PROPRIETARY = 5; + */ + private static final int FOR_PROPRIETARY = 1; + // End of Vanzo: zhuhandong + + private Button mSuccess = null; + + private Button mFail = null; + + private Button mSearch = null; + + private float mFrequency = 97.1f; + + private MediaPlayer mMP = null; + + private boolean mIsSearch = false; + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + if (msg.what == 1) { + mSearch.setEnabled(true); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.test_view); + + mSuccess = (Button) findViewById(R.id.success); + mFail = (Button) findViewById(R.id.fail); + mSearch = (Button) findViewById(R.id.search); + mSuccess.setOnClickListener(this); + mSuccess.setEnabled(false); + mFail.setOnClickListener(this); + mSearch.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (!mIsSearch) { + mSuccess.setEnabled(true); + mIsSearch = true; + new Thread() { + public void run() { + mFrequency = autoSearch(mFrequency, true); + FmRadioNative.tune(mFrequency); + FmRadioNative.setMute(false); + mIsSearch = false; + } + }.start(); + } + } + }); + + mSearch.setEnabled(false); + new Thread() { + public void run() { + FmRadioNative.openDev(); + mMP = new MediaPlayer(); + try { + mMP.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + } catch (IOException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } catch (IllegalArgumentException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } + mMP.setAudioStreamType(AudioManager.STREAM_MUSIC); + enableFMAudio(true); +/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:05:06 +0800 + * force use speaker + if (isHeadset()) { + */ + //if (isHeadset() && !FeatureOption.VANZO_FEATURE_FM_ONLY_USE_EARPHONE) { +// End of Vanzo:fenghaitao + //setForceUseSpeaker(true); + //} + FmRadioNative.powerUp(mFrequency); + FmRadioNative.setMute(false); + mHandler.sendEmptyMessage(1); + } + }.start(); + } + + @Override + public void onClick(View v) { + Intent data = new Intent(); + data.putExtra("result", v == mSuccess); + setResult(RESULT_OK, data); + finish(); + } + + private void enableFMAudio(boolean bEnable) { + if (bEnable) { + if (mMP.isPlaying()) { + Log.e(TAG, "Error: FM audio is already enabled."); + } else { + try { + mMP.prepare(); + } catch (Exception e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare."); + } + mMP.start(); + } + } else { + if (mMP.isPlaying()) { + mMP.stop(); + mMP.reset(); + mMP.release(); + } else { + Log.e(TAG, "Error: FM audio is already disabled."); + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + enableFMAudio(false); + FmRadioNative.closeDev(); + setForceUseSpeaker(false); + FmRadioNative.stopScan(); + } + + private float autoSearch(float action, boolean isUp) { + return FmRadioNative.seek(action, isUp); + } + + private void setForceUseSpeaker(boolean isOn) { + int forcedUseForMedia = isOn ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; + AudioSystem.setForceUse(FOR_PROPRIETARY, forcedUseForMedia); + } + + private boolean isHeadset() { + return FmRadioUtils.isWiredHeadsetReallyOn(); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~ new file mode 100755 index 0000000..27e9be0 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/TestFM.java~ @@ -0,0 +1,168 @@ +package com.mediatek.fmradio; + +import android.app.Activity; +import android.content.Intent; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +import java.io.IOException; +/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:04:11 +0800 + * force use speaker + */ +//import com.android.featureoption.FeatureOption; +// End of Vanzo:fenghaitao +public class TestFM extends Activity implements OnClickListener { + + public static final String TAG = "FM radio service"; + /* Vanzo:zhuhandong on: Fri, 27 Apr 2015 15:57:27 +0800 + * here to user speaker + * private static final int FOR_PROPRIETARY = 5; + */ + private static final int FOR_PROPRIETARY = 1; + // End of Vanzo: zhuhandong + + private Button mSuccess = null; + + private Button mFail = null; + + private Button mSearch = null; + + private float mFrequency = 97.1f; + + private MediaPlayer mMP = null; + + private boolean mIsSearch = false; + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + if (msg.what == 1) { + mSearch.setEnabled(true); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.test_view); + + mSuccess = (Button) findViewById(R.id.success); + mFail = (Button) findViewById(R.id.fail); + mSearch = (Button) findViewById(R.id.search); + mSuccess.setOnClickListener(this); + mSuccess.setEnabled(false); + mFail.setOnClickListener(this); + mSearch.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (!mIsSearch) { + mSuccess.setEnabled(true); + mIsSearch = true; + new Thread() { + public void run() { + mFrequency = autoSearch(mFrequency, true); + FmRadioNative.tune(mFrequency); + FmRadioNative.setMute(false); + mIsSearch = false; + } + }.start(); + } + } + }); + + mSearch.setEnabled(false); + new Thread() { + public void run() { + FmRadioNative.openDev(); + mMP = new MediaPlayer(); + try { + mMP.setDataSource("THIRDPARTY://MEDIAPLAYER_PLAYERTYPE_FM"); + } catch (IOException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } catch (IllegalArgumentException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } catch (IllegalStateException ex) { + Log.e(TAG, "setDataSource: " + ex); + return; + } + mMP.setAudioStreamType(AudioManager.STREAM_MUSIC); + enableFMAudio(true); +/* Vanzo:fenghaitao on: Tue, 30 Jun 2015 15:05:06 +0800 + * force use speaker + if (isHeadset()) { + */ + if (isHeadset() && !FeatureOption.VANZO_FEATURE_FM_ONLY_USE_EARPHONE) { +// End of Vanzo:fenghaitao + setForceUseSpeaker(true); + } + FmRadioNative.powerUp(mFrequency); + FmRadioNative.setMute(false); + mHandler.sendEmptyMessage(1); + } + }.start(); + } + + @Override + public void onClick(View v) { + Intent data = new Intent(); + data.putExtra("result", v == mSuccess); + setResult(RESULT_OK, data); + finish(); + } + + private void enableFMAudio(boolean bEnable) { + if (bEnable) { + if (mMP.isPlaying()) { + Log.e(TAG, "Error: FM audio is already enabled."); + } else { + try { + mMP.prepare(); + } catch (Exception e) { + Log.e(TAG, "Exception: Cannot call MediaPlayer prepare."); + } + mMP.start(); + } + } else { + if (mMP.isPlaying()) { + mMP.stop(); + mMP.reset(); + mMP.release(); + } else { + Log.e(TAG, "Error: FM audio is already disabled."); + } + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + enableFMAudio(false); + FmRadioNative.closeDev(); + setForceUseSpeaker(false); + FmRadioNative.stopScan(); + } + + private float autoSearch(float action, boolean isUp) { + return FmRadioNative.seek(action, isUp); + } + + private void setForceUseSpeaker(boolean isOn) { + int forcedUseForMedia = isOn ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE; + AudioSystem.setForceUse(FOR_PROPRIETARY, forcedUseForMedia); + } + + private boolean isHeadset() { + return FmRadioUtils.isWiredHeadsetReallyOn(); + } +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java new file mode 100755 index 0000000..3c65f4c --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/AddFavoriteDialog.java @@ -0,0 +1,137 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.mediatek.fmradio.ExtensionUtils; +import com.mediatek.fmradio.FmRadioUtils; +import com.mediatek.fmradio.R; +import com.mediatek.fmradio.ext.IProjectStringExt; + +/** + * Add a station as favorite caller should implement AddFavoriteListener + */ +public class AddFavoriteDialog extends DialogFragment { + private static final String STATION_NAME = "station_name"; + private static final String STATION_FREQ = "station_freq"; + private AddFavoriteListener mListener = null; + + /** + * Create add favorite dialog instance according station name and station + * frequency + * + * @param stationName The station name + * @param stationFreq The station frequency + * @return add favorite dialog instance + */ + public static AddFavoriteDialog newInstance(String stationName, int stationFreq) { + AddFavoriteDialog fragment = new AddFavoriteDialog(); + Bundle args = new Bundle(2); + args.putString(STATION_NAME, stationName); + args.putInt(STATION_FREQ, stationFreq); + fragment.setArguments(args); + return fragment; + } + + /** + * Add favorite listener, caller should implement + */ + public interface AddFavoriteListener { + /** + * Add a station as favorite + */ + void addFavorite(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (AddFavoriteListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + String stationName = getArguments().getString(STATION_NAME); + int stationFreq = getArguments().getInt(STATION_FREQ); + Context context = getActivity().getApplicationContext(); + IProjectStringExt projectStringExt = ExtensionUtils.getExtension(context); + View v = View.inflate(getActivity(), R.layout.addstation, null); + EditText editTextStationName = (EditText) v.findViewById(R.id.dlg_add_station_name_text); + ((TextView) v.findViewById(R.id.dlg_add_station_freq_text)) + .setText(FmRadioUtils.formatStation(stationFreq)); + // if not have current station name, hint with default station name + // else hint current station name + if (null == stationName || "".equals(stationName)) { + editTextStationName.setHint(R.string.default_station_name); + } else { + editTextStationName.setHint(stationName); + } + editTextStationName.requestFocus(); + editTextStationName.requestFocusFromTouch(); + editTextStationName.setText(""); + return new AlertDialog.Builder(getActivity()) + // Must call setTitle here or the title will not be displayed. + .setTitle(projectStringExt.getProjectString(context, + R.string.add_to_favorite, R.string.add_to_favorite1)) + .setView(v) + .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + mListener.addFavorite(); + } + }).setNegativeButton(R.string.btn_cancel, null) // cancel button + // not need to + // handle + // any thing + .create(); + } + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java new file mode 100755 index 0000000..f0f3fb7 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/DeleteFavoriteDialog.java @@ -0,0 +1,107 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; + +import com.mediatek.fmradio.ExtensionUtils; +import com.mediatek.fmradio.R; +import com.mediatek.fmradio.ext.IProjectStringExt; + +/** + * Delete favorite from favorite channel list, caller should implement + * DeleteFavoriteListener + */ +public class DeleteFavoriteDialog extends DialogFragment { + private DeleteFavoriteListener mListener = null; + + /** + * Create delete favorite dialog instance, caller should implement + * DeleFavoriteListener + * + * @return delete favorite dialog + */ + public static DeleteFavoriteDialog newInstance() { + return new DeleteFavoriteDialog(); + } + + /** + * Delete favorite listener + */ + public interface DeleteFavoriteListener { + /** + * Delete favorite from favorite channel list + */ + void deleteFavorite(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (DeleteFavoriteListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Context context = getActivity().getApplicationContext(); + IProjectStringExt projectStringExt = ExtensionUtils.getExtension(context); + return new AlertDialog.Builder(getActivity()) + .setTitle(projectStringExt.getProjectString(context, + R.string.dlg_delete_confirm_title, R.string.dlg_delete_confirm_title1)) + .setMessage(projectStringExt.getProjectString(context, + R.string.dlg_delete_confirm_text, R.string.dlg_delete_confirm_text1)) + .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + mListener.deleteFavorite(); + } + }) + .setNegativeButton(R.string.btn_cancel, null) + .create(); + } + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java new file mode 100755 index 0000000..3e360ce --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/EditFavoriteDialog.java @@ -0,0 +1,225 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.Selection; +import android.text.Spanned; +import android.text.TextWatcher; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import com.mediatek.fmradio.FmRadioStation; +import com.mediatek.fmradio.FmRadioUtils; +import com.mediatek.fmradio.R; + +/** + * Edit favorite station name and frequency, caller should implement + * EditFavoriteListener + */ +public class EditFavoriteDialog extends DialogFragment { + private static final String STATION_NAME = "station_name"; + private static final String STATION_FREQ = "station_freq"; + private EditFavoriteListener mListener = null; + private EditText mEditTextFrequency = null; + + /** + * Create edit favorite dialog instance, caller should implement edit + * favorite listener + * + * @param stationName The station name + * @param stationFreq The station frequency + * @return edit favorite dialog + */ + public static EditFavoriteDialog newInstance(String stationName, int stationFreq) { + EditFavoriteDialog fragment = new EditFavoriteDialog(); + Bundle args = new Bundle(2); + args.putString(STATION_NAME, stationName); + args.putInt(STATION_FREQ, stationFreq); + fragment.setArguments(args); + return fragment; + } + + /** + * Edit favorite listener + */ + public interface EditFavoriteListener { + /** + * Edit favorite station name and station frequency + */ + void editFavorite(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (EditFavoriteListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + String stationName = getArguments().getString(STATION_NAME); + int stationFreq = getArguments().getInt(STATION_FREQ); + View v = View.inflate(getActivity(), R.layout.editstation, null); + EditText editTextStationName = (EditText) v.findViewById(R.id.dlg_edit_station_name_text); + mEditTextFrequency = (EditText) v.findViewById(R.id.dlg_edit_station_freq_text); + + final int lengthOf100Khz = 5; + final int maxFrequencyLength = lengthOf100Khz; + mEditTextFrequency.setFilters(new InputFilter[] { + mFilter, + new InputFilter.LengthFilter(maxFrequencyLength) + }); + + mEditTextFrequency.addTextChangedListener(mWatcher100KHZ); + + mEditTextFrequency.setText(FmRadioUtils.formatStation(stationFreq)); + if (null == stationName || "".equals(stationName)) { + editTextStationName.setHint(R.string.default_station_name); + } else { + editTextStationName.setHint(stationName); + } + editTextStationName.requestFocus(); + editTextStationName.requestFocusFromTouch(); + // Edit + editTextStationName.setText(stationName); + Editable text = editTextStationName.getText(); + Selection.setSelection(text, text.length()); + return new AlertDialog.Builder(getActivity()) + // Must call setTitle here or the title will not be displayed. + .setTitle(getString(R.string.dlg_addedit_title_edit)).setView(v) + .setPositiveButton(R.string.edit_frequency_overwrite_text, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + mListener.editFavorite(); + } + }) + .setNegativeButton(R.string.btn_cancel, null) + .create(); + } + + InputFilter mFilter = new InputFilter() { + + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, + int dstart, int dend) { + final int accuracy = 1; + + if ("".equals(source.toString())) { + return null; + } + + // according the point divide string + String[] splitArray = dest.toString().split("\\."); + // input have point, should delete the redundant + if (splitArray.length > 1) { + String fraction = splitArray[1]; + int deleteIndex = fraction.length() + 1 - accuracy; + if (deleteIndex > 0) { + int dotIndex = dest.toString().indexOf(".") + 1; + if (dstart >= dotIndex) { + if ((end - deleteIndex) >= start) { + return source.subSequence(start, end - deleteIndex); + } + } else { + return dest.subSequence(dstart, dend) + source.toString(); + } + } + } + return null; + } + }; + + // Add for 100khz + // add for overwrite frequency feature + private TextWatcher mWatcher100KHZ = new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (null == getDialog()) { + return; + } + CharSequence cs = mEditTextFrequency.getText(); + float frequency = 0; + try { + frequency = Float.parseFloat(cs.toString()); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + final int convertData = 10; + int station = Math.round(frequency * convertData); + Button positiveButton = ((AlertDialog) getDialog()) + .getButton(DialogInterface.BUTTON_POSITIVE); + + if (null != positiveButton) { + if (FmRadioStation.isStationExistInChList( + getActivity().getApplicationContext(), station)) { + positiveButton.setText(R.string.edit_frequency_overwrite_text); + } else { + positiveButton.setText(R.string.btn_ok); + } + } + } + + /** + * No need to implement + */ + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + /** + * No need to implement + */ + @Override + public void afterTextChanged(Editable s) { + } + }; + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java new file mode 100755 index 0000000..2d702f0 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/NoAntennaDialog.java @@ -0,0 +1,124 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.dialogs; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.content.DialogInterface.OnKeyListener; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; + +import com.mediatek.fmradio.R; + +/** + * No antenna dialog, caller should implement NoAntennaListener + */ +public class NoAntennaDialog extends DialogFragment { + private static final String TAG = "FmRx/NoAntennaDialog"; + private NoAntennaListener mListener = null; + + /** + * Create no antenna dialog instance, caller should implement + * NoAntennaListener + */ + public static NoAntennaDialog newInstance() { + return new NoAntennaDialog(); + } + + /** + * No antenna listener + */ + public interface NoAntennaListener { + /** + * Continue to operate when no antenna + */ + void noAntennaContinue(); + + /** + * Cancel operate when no antenna + */ + void noAntennaCancel(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (NoAntennaListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(R.string.no_antenna_info) + .setTitle(R.string.dlg_noantenna_title) + .setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + mListener.noAntennaContinue(); + } + }) + .setNegativeButton(R.string.btn_no, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + mListener.noAntennaCancel(); + } + }); + AlertDialog d = builder.create(); + d.setCanceledOnTouchOutside(false); + d.setOnKeyListener(new OnKeyListener() { + @Override + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { + Log.d(TAG, "click back key, need to exit fm"); + mListener.noAntennaCancel(); + } + return false; + } + }); + return d; + } + +} diff --git a/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java new file mode 100755 index 0000000..3e049a0 --- /dev/null +++ b/MediaTek/FmRadio/src/com/mediatek/fmradio/dialogs/SearchChannelsDialog.java @@ -0,0 +1,111 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2011-2014. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.dialogs; + +import android.app.Activity; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.os.Bundle; + +import com.mediatek.fmradio.R; + +/** + * This class provider search dialog and cancel search function, caller should + * implement CancelSearchListener + */ +public class SearchChannelsDialog extends DialogFragment { + private CancelSearchListener mListener = null; + + /** + * Create search channels dialog instance, caller should implement + * CancelSearchListener + * + * @return The dialog instance + */ + public static SearchChannelsDialog newInstance() { + return new SearchChannelsDialog(); + } + + /** + * Cancel search listener + */ + public interface CancelSearchListener { + /** + * Cancel search + */ + void cancelSearch(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (CancelSearchListener) activity; + } catch (ClassCastException e) { + e.printStackTrace(); + } + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + String message = getActivity().getString(R.string.dlg_progress_text); + ProgressDialog searchDialog = new ProgressDialog(getActivity()); + searchDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); + searchDialog.setMessage(message); + searchDialog.setTitle(R.string.dlg_progress_title); + searchDialog.setCancelable(true); + // if not set, user touch outside of FMRadio will cancel search + searchDialog.setCanceledOnTouchOutside(false); + searchDialog.setButton(getString(R.string.btn_cancel), + new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + mListener.cancelSearch(); + } + }); + return searchDialog; + } + + @Override + public void onCancel(DialogInterface dialog) { + mListener.cancelSearch(); + } + +} diff --git a/MediaTek/FmRadio/tests/Android.mk b/MediaTek/FmRadio/tests/Android.mk new file mode 100755 index 0000000..0e3521a --- /dev/null +++ b/MediaTek/FmRadio/tests/Android.mk @@ -0,0 +1,57 @@ +# Copyright Statement: +# +# This software/firmware and related documentation ("MediaTek Software") are +# protected under relevant copyright laws. The information contained herein +# is confidential and proprietary to MediaTek Inc. and/or its licensors. +# Without the prior written permission of MediaTek inc. and/or its licensors, +# any reproduction, modification, use or disclosure of MediaTek Software, +# and information contained herein, in whole or in part, shall be strictly prohibited. +# +# MediaTek Inc. (C) 2010. All rights reserved. +# +# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES +# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") +# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON +# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. +# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE +# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR +# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH +# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES +# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES +# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK +# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR +# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND +# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, +# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, +# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO +# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. +# +# The following software/firmware and/or related documentation ("MediaTek Software") +# have been modified by MediaTek Inc. All revisions are subject to any receiver's +# applicable license agreements with MediaTek Inc. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + + + +# We only want this apk build for tests. +LOCAL_MODULE_TAGS := tests +LOCAL_CERTIFICATE := platform + +LOCAL_JAVA_LIBRARIES := android.test.runner +LOCAL_STATIC_JAVA_LIBRARIES := librobotium4 + +# Include all test java files. +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := FmRadioTests + +LOCAL_INSTRUMENTATION_FOR := FmRadio + +include $(BUILD_PACKAGE) + +# Use the folloing include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/MediaTek/FmRadio/tests/AndroidManifest.xml b/MediaTek/FmRadio/tests/AndroidManifest.xml new file mode 100755 index 0000000..1f8d990 --- /dev/null +++ b/MediaTek/FmRadio/tests/AndroidManifest.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.mediatek.fmradio.tests" + android:versionCode="1" + android:versionName="1.0"> + <uses-permission android:name="android.permission.ACCESS_FM" /> + + <application> + <uses-library android:name="android.test.runner" /> + <!-- uses-library android:name="com.jayway.android.robotium" /> --> + </application> + + <instrumentation + android:name=".FmRadioFunctionRunner" + android:label="FM Radio function auto-tests" + android:targetPackage="com.mediatek.fmradio" /> + <instrumentation + android:name=".FmRadioPerformanceRunner" + android:label="FM Radio performance auto-tests" + android:targetPackage="com.mediatek.fmradio" /> + <instrumentation + android:name="com.mediatek.fmradio.tests.FmRadioLaunchPerformance" + android:label="FmRadio Launch Performance" + android:targetPackage="com.mediatek.fmradio" /> + + <uses-permission android:name="android.permission.RUN_INSTRUMETATION" /> +</manifest> diff --git a/MediaTek/FmRadio/tests/NOTICE b/MediaTek/FmRadio/tests/NOTICE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/MediaTek/FmRadio/tests/NOTICE diff --git a/MediaTek/FmRadio/tests/README b/MediaTek/FmRadio/tests/README new file mode 100755 index 0000000..6a66800 --- /dev/null +++ b/MediaTek/FmRadio/tests/README @@ -0,0 +1,25 @@ +FmRadioTests.apk is the unit test of FmRadio.apk. + +This library is pre-built by MediaTek internal. + +WHAT IT DOES? +============= +It is designed to unit text for FM radio application. + +HOW IT WAS BUILT? +================== +It needs the following library from AOSP: +1. framework.jar + +and the following libs from MediaTek: +1. FmRadio.apk +2. librobotium4.jar + +All source/dependency modules of this module are already put in +'vendor/mediatek/libs' folder. + +HOW TO USE IT? +============== +1. Install FmRadioTests.apk in mediatek platform. +2. Use adb command to run test: +adb shell am instrument -w com.mediatek.fmradio.tests/.FmRadioFunctionRunner diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java new file mode 100755 index 0000000..f7039c7 --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioActivityTest.java @@ -0,0 +1,1054 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import java.io.File; +import com.jayway.android.robotium.solo.Solo; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.app.Instrumentation; +import android.app.Instrumentation.ActivityMonitor; +import android.content.Context; +import android.database.Cursor; +import android.media.AudioManager; +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.net.Uri; +import android.test.ActivityInstrumentationTestCase2; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MenuInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.mediatek.fmradio.FmRadioActivity; +import com.mediatek.fmradio.FmRadioFavorite; +import com.mediatek.fmradio.FmRadioUtils; +import com.mediatek.fmradio.FmRadioStation; +import com.mediatek.fmradio.R; + +public class FmRadioActivityTest extends ActivityInstrumentationTestCase2<FmRadioActivity> { + private Instrumentation mInstrumentation = null; + private Solo mSolo = null; + private Context mContext = null; + private ActivityMonitor mActivityMonitor = null; + + private ActionBar mActionBar = null; + private FmRadioActivity mFmRadioActivity = null; + private FmRadioFavorite mFmRadioFavorite = null; + private AudioManager mAudioManager = null; + private OnAudioFocusChangeListener mFMAudioFocusChangeListener = null; + + // bottom bar + private ImageButton mButtonDecrease = null; + private ImageButton mButtonPrevStation = null; + private ImageButton mButtonNextStation = null; + private ImageButton mButtonIncrease = null; +// private ImageButton mButtonPlayStop = null; + private MenuInflater mMenuInflater = null; + // the star + private ImageButton mButtonAddToFavorite = null; + // record bar + private ImageButton mButtonRecord = null; + private ImageButton mButtonStop = null; + private ImageButton mButtonPlayback = null; + private AlertDialog mDialogRDSSetting = null; + + private Button mButtonRecordSave = null; + private EditText mEditTextRecordName = null; + + private static final String CONTENTURI = "content://com.mediatek.fmradio.FmRadioContentProvider/station"; + + private TextView mTextViewFrequency = null; + private static final int CHECK_TIME = 100; + private static final int SHORT_TIME = 2000; + private static final int ONE_SECOND = 1000; + private static final int EXECUTE_TIME = 500; + private static final int TIMEOUT = 5000; + private static final int WAIT_TEAR_DOWN = 3000; + private static final int WAIT_MOUNT_UNMOUNT = 7000; + private static final int RECORDING_FILE_TIME = 10000; + + private static final long SEARCH_TIME = 20000; + private static final int CONVERT_RATE = 10; + private static final int TUNE_STEP = 1; + private static final String TAG = "FmRadioFunctionTest"; + + public FmRadioActivityTest() { + super("com.mediatek.fmradio", FmRadioActivity.class); + } + + public FmRadioActivityTest(String pkg, Class<FmRadioActivity> activityClass) { + super("com.mediatek.fmradio", FmRadioActivity.class); + } + + @Override + protected void setUp() { + try { + super.setUp(); + } catch (Exception e) { + e.printStackTrace(); + } + setActivityInitialTouchMode(false); + mInstrumentation = this.getInstrumentation(); + assertNotNull(mInstrumentation); + mFmRadioActivity = getActivity(); + assertNotNull(mFmRadioActivity); + mSolo = new Solo(getInstrumentation(), mFmRadioActivity); + mContext = mFmRadioActivity.getApplicationContext(); + mAudioManager = + (AudioManager) mFmRadioActivity.getSystemService(mContext.AUDIO_SERVICE); + waitForPowerupWithTimeout(TIMEOUT); + //waitForInitedWithTimeout(TIMEOUT); + + mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease); + mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation); + mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation); + mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase); + + mButtonAddToFavorite = (ImageButton) mFmRadioActivity + .findViewById(R.id.button_add_to_favorite); + + mButtonRecord = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_record); + mButtonStop = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_stop); + mButtonPlayback = (ImageButton) mFmRadioActivity.findViewById(R.id.btn_playback); + + mTextViewFrequency = (TextView) mFmRadioActivity + .findViewById(R.id.station_value); + } + + // click play/stop button. + public void testCase01_PowerUpAndPowerDown() { + boolean isPlaying = false; + // test FM power down + makeFMPowerUp(); + mInstrumentation.waitForIdleSync(); + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + mSolo.sleep(SHORT_TIME); + checkFMStopState(); + + // test FM power up + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkFMPlayingState(); + } + + // click speaker/earphone menu item. + public void testCase02_SwitchSpeakerAndEarphone() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone); + String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker); + // test FM switch to speaker + switchSpeaker(); + mSolo.sleep(EXECUTE_TIME); + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + assertTrue(mSolo.searchText(earphone)); + mSolo.goBack(); + // test FM switch to earphone + switchEarphone(); + mSolo.sleep(EXECUTE_TIME); + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + assertTrue(mSolo.searchText(speaker)); + mSolo.goBack(); + } + + // click favorite star. + public void testCase03_AddDeleteFavoriteChannels() { + int station = 0; + // test add channel as favorite + station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + deleteChannelFromFavorite(station); + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + assertTrue(FmRadioStation.isFavoriteStation(mFmRadioActivity, station)); + + // test delete channel from favorite + station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + addChannelAsFavorite(station); + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + assertFalse(FmRadioStation.isFavoriteStation(mFmRadioActivity, station)); + } + + // click tune frequency. + public void testCase04_TuneFrequency() { + int tuneStation = 0, currentStation = 0; + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + // test decrease 0.1 MHZ + tuneStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + clickView(mButtonDecrease); + mInstrumentation.waitForIdleSync(); + tuneStation -= TUNE_STEP; + if (tuneStation < FmRadioTestCaseUtil.LOWEST_STATION) { + tuneStation = FmRadioTestCaseUtil.HIGHEST_STATION; + } + // add sleep time, because instrumentation waitForIdleSync just wait for + // UI thread end, must wait for all hardware and database operation end + mSolo.sleep(SHORT_TIME); + currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity); + assertEquals(tuneStation, currentStation); + + // add to favorite + testCase03_AddDeleteFavoriteChannels(); + + // test increase 0.1 MHZ + tuneStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + clickView(mButtonIncrease); + mInstrumentation.waitForIdleSync(); + tuneStation += TUNE_STEP; + if (tuneStation > FmRadioTestCaseUtil.HIGHEST_STATION) { + tuneStation = FmRadioTestCaseUtil.LOWEST_STATION; + } + mSolo.sleep(SHORT_TIME); + currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity); + assertEquals(tuneStation, currentStation); + } + + // click tune station + public void testCase05_SwitchChannel() { + int oldStation = 0, stationFromUI = 0, stationFromDB = 0; + if (!mButtonPrevStation.isEnabled()) { + makeFMPowerUp(); + } + + // test seek previous station + oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + clickView(mButtonPrevStation); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(TIMEOUT); + stationFromUI = FmRadioTestCaseUtil + .getStationFromUI(mTextViewFrequency); + // check station change + assertTrue(oldStation != stationFromUI); + + // test seek next station + oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + clickView(mButtonNextStation); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(TIMEOUT); + stationFromUI = FmRadioTestCaseUtil + .getStationFromUI(mTextViewFrequency); + // check station change + assertTrue(oldStation != stationFromUI); + } + + // click cancel when search channel. click back key when search channel. + public void testCase06_CancelChannelSearch() { + // check cancel scan when power up + startScanWhenPowerUp(); + checkCancelScan(); + checkFMPlayingState(); + + } + + // search channel and tune to one station. + public void testCase07_SearchChannels() { + // check scan when power up + startScanWhenPowerUp(); + checkFinishScan(); + } + + // enter channel list activity + public void testCase08_EnterChannelList() { + Log.d(TAG, ">>> testCase08_EnterChannelList"); + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mActivityMonitor = new ActivityMonitor( + "com.mediatek.fmradio.FmRadioFavorite", null, false); + mInstrumentation.addMonitor(mActivityMonitor); + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, + R.id.fm_channel_list, 0); + mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor + .waitForActivityWithTimeout(TIMEOUT); + assertNotNull(mFmRadioFavorite); + mSolo.sleep(SHORT_TIME); + Uri uri = Uri.parse(CONTENTURI); + Cursor c = mFmRadioFavorite.getContentResolver().query( + uri, + new String[] { FmRadioStation.Station._ID, + FmRadioStation.Station.COLUMN_STATION_FREQ, + FmRadioStation.Station.COLUMN_STATION_TYPE }, null, + null, null); + assertTrue(c != null && c.getCount() > 0); + Log.d(TAG, "testCase08_EnterChannelList count:" + c.getCount()); + try { + if (c != null) { + c.moveToFirst(); + while (!c.isAfterLast()) { + int stationFreq = c.getInt(1); + int stationType = c.getInt(2); + if ((FmRadioStation.STATION_TYPE_FAVORITE == stationType) + || (FmRadioStation.STATION_TYPE_SEARCHED == stationType)) { + Log.d(TAG, "testCase08_EnterChannelList stationFreq:" + stationFreq + + ", stationType:" + stationType); + assertTrue(FmRadioTestCaseUtil.isExistInChannelList( + mFmRadioFavorite, stationFreq)); + } + c.moveToNext(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (c != null) { + c.close(); + } + } + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + Log.d(TAG, "<<< testCase08_EnterChannelList"); + } + + // when play fm, audio focus loss, and stop fm + public void testCase09_CheckFocusLoss() { + mInstrumentation.waitForIdleSync(); + makeFMPowerDown(); + + // check when power up, music get focus, fm power down + //mInstrumentation + // .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + //mInstrumentation.waitForIdleSync(); + mSolo.sleep(EXECUTE_TIME); + //FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + //mInstrumentation.waitForIdleSync(); + checkFMStopState(); + //mSolo.sleep(SHORT_TIME); + + mSolo.sleep(SHORT_TIME); + // fm is power up, check when fm is searching, focus is loss, fm power down + startScanWhenPowerUp(); + mSolo.sleep(SHORT_TIME); + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(TIMEOUT); + // check music is active, fm is power down + checkFMStopState(); + } + + public void testCase10_EnterRecordingMode() { + enterRecordingMode(); + mSolo.sleep(SHORT_TIME); + checkRecordNotSaveIdle(); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + mInstrumentation.waitForIdleSync(); + checkFMPlayingState(); + } + + // recording, discard, save. + public void testCase11_RecordingAndSave() { + enterRecordingMode(); + mSolo.sleep(SHORT_TIME); + // judge whether enter recording mode + checkRecordNotSaveIdle(); + + // test recording + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingState(); + // make recording time have 3 seconds + mSolo.sleep(SHORT_TIME); + // test stop reocording and save recording file + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingStopState(); + + // enter some illegal characters + mEditTextRecordName = (EditText) mSolo.getView(R.id.fm_recording_text); + String fileName = mEditTextRecordName.getText().toString(); + mSolo.clearEditText(mEditTextRecordName); + mSolo.enterText(mEditTextRecordName, "test:"); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + mButtonRecordSave = (Button) mSolo.getView(R.id.fm_recording_btn_save); + assertFalse(mButtonRecordSave.isEnabled()); + // enter some legal characters + mSolo.clearEditText(mEditTextRecordName); + mSolo.enterText(mEditTextRecordName, fileName); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + assertTrue(mButtonRecordSave.isEnabled()); + + // click discard not save file + mSolo.clickOnButton(mContext.getString(R.string.btn_discard_recording)); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordNotSaveIdle(); + + // recording and make focus at OK button of save recording dialog + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingState(); + // make recording time have 3 seconds + mSolo.sleep(SHORT_TIME); + // test stop reocording and save recording file + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingStopState(); + + // click OK button of save recording dialog + mSolo.clickOnButton(mContext.getString(R.string.btn_save_recording)); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordHasSavedIdle(); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + mInstrumentation.waitForIdleSync(); + } + + // recording and playback. + public void testCase12_RecordingAndPlayBack() { + enterRecordingMode(); + mSolo.sleep(TIMEOUT); + // judge whether enter recording mode + checkRecordNotSaveIdle(); + + // test recording + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingState(); + // make recording time have 3 seconds + mSolo.sleep(SHORT_TIME); + // test stop reocording and save recording file + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordingStopState(); + + // click OK button of save recording dialog + mSolo.clickOnButton(mContext.getString(R.string.btn_save_recording)); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkRecordHasSavedIdle(); + + // test playback recording file + clickView(mButtonPlayback); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(EXECUTE_TIME); + checkPlayingBackState(); + mSolo.sleep(TIMEOUT); + checkPlayingBackFinished(); + mSolo.sleep(SHORT_TIME); + + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + mInstrumentation.waitForIdleSync(); + } + + // test fm recreate when scan, and fm is powerup state. + public void testCase14_relaunchFmWhenCancelScan() { + Log.d(TAG, ">>> testCase14_relaunchFmWhenCancelScan"); + int oldStation = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + String cancel = mFmRadioActivity.getString(R.string.btn_cancel); + // test cancel scan + checkRelaunchWhenScan(); + // mInstrumentation.waitForIdleSync(); + mSolo.clickOnButton(cancel); + //mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + checkFMPlayingState(); + + int stationFromUI = FmRadioTestCaseUtil + .getStationFromUI(mTextViewFrequency); + // check station not change + assertTrue(oldStation == stationFromUI); + + checkRelaunchWhenScan(); + checkFinishScan(); + + } + + // mount, unmount sd card when recording + /*public void testCase15_mountUnmountWhenRecording() { + FmRadioTestCaseUtil.mountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + mSolo.sleep(SHORT_TIME); + enterRecordingMode(); + mSolo.sleep(SHORT_TIME); + checkRecordNotSaveIdle(); + String toastStartRecord = mContext.getString(R.string.toast_start_recording); + String toastSdCardMiss = mContext.getString(R.string.toast_sdcard_missing); + String save = mFmRadioActivity.getString(R.string.btn_save_recording); + String discard = mFmRadioActivity.getString(R.string.btn_discard_recording); + // unmount sd card when recording + + clickView(mButtonRecord); + assertTrue(mSolo.waitForText(toastStartRecord, 0, SHORT_TIME)); + mSolo.sleep(SHORT_TIME); + FmRadioTestCaseUtil.unmountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + assertFalse(mSolo.searchButton(save, true)); + checkRecordNotSaveIdle(); + + // click record after unmount + clickView(mButtonRecord); + assertTrue(mSolo.waitForText(toastSdCardMiss)); + checkRecordNotSaveIdle(); + + // check mount sd card and stop recording, popup save dialog, then unmount sd card + FmRadioTestCaseUtil.mountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + clickView(mButtonRecord); + assertTrue(mSolo.waitForText(toastStartRecord, 0, SHORT_TIME)); + mSolo.sleep(SHORT_TIME); + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + assertTrue(mSolo.searchButton(save, true)); + FmRadioTestCaseUtil.unmountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + assertFalse(mSolo.searchButton(save, true)); + + // mount sdcard finally + FmRadioTestCaseUtil.mountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + mInstrumentation.waitForIdleSync(); + } + + // mount, unmount sd card when recording + public void testCase16_mountUnmountWhenPlayback() { + // mount sdcard first + FmRadioTestCaseUtil.mountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + + // record some and playback + String save = mContext.getString(R.string.btn_save_recording); + String error = mContext.getString(R.string.toast_player_internal_error); + mSolo.sleep(SHORT_TIME); + enterRecordingMode(); + mSolo.sleep(SHORT_TIME); + + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(RECORDING_FILE_TIME); + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + assertTrue(mSolo.searchButton(save, true)); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + mSolo.clickOnButton(save); + mSolo.sleep(SHORT_TIME); + clickView(mButtonPlayback); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + + // unmount sd card + FmRadioTestCaseUtil.unmountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + assertTrue(mSolo.waitForText(error, 0, WAIT_MOUNT_UNMOUNT)); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + checkRecordNotSaveIdle(); + mSolo.sleep(SHORT_TIME); + + // mount sdcard finally + FmRadioTestCaseUtil.mountSDCard(mContext); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(WAIT_MOUNT_UNMOUNT); + }*/ + + // check fm exit when power up state + public void testCase17_FmExit() { + boolean isPlaying = false; + // test FM power down + makeFMPowerUp(); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + + // test FM power up + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + mSolo.sleep(SHORT_TIME); + } + + // check fm back key when power down state + public void testCase18_FmBackKeyExit() { + boolean isPlaying = false; + makeFMPowerUp(); + mInstrumentation.waitForIdleSync(); + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + mSolo.sleep(SHORT_TIME); + checkFMStopState(); + mSolo.goBack(); + mSolo.sleep(SHORT_TIME); + } + + // check fm tune from channel list + public void testCase19_relaunchFmTuneToStation() { + boolean isPlaying = false; + makeFMPowerUp(); + // add to favorite + int station = 0; + // test add channel as favorite + station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + deleteChannelFromFavorite(station); + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + assertTrue(FmRadioStation.isFavoriteStation(mFmRadioActivity, station)); + + // test FM power up + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_channel_list, 0); + mSolo.sleep(SHORT_TIME); + mInstrumentation.waitForIdleSync(); + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + mSolo.sleep(SHORT_TIME); + + relaunchFm(); + mFmRadioFavorite = (FmRadioFavorite) mSolo.getCurrentActivity(); + mSolo = new Solo(mInstrumentation, mFmRadioFavorite); + mContext = mFmRadioFavorite.getApplicationContext(); + station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + String pStation = String.valueOf((float) station / CONVERT_RATE); + mSolo.clickOnText(pStation); + mInstrumentation.waitForIdleSync(); + // delete favorite + deleteChannelFromFavorite(station); + mSolo.sleep(SHORT_TIME); + checkFMPlayingState(); + } + + // recorder. save same name recorder file + public void testCase20_saveRecorderWithSameName() { + enterRecordingMode(); + File sdDir = new File(FmRadioUtils.getDefaultStoragePath()); + File recordingFile = new File(sdDir.getPath() + "/FM Recording", "recorder_file.ogg"); + if (recordingFile.exists()) { + recordingFile.delete(); + } + mSolo.sleep(SHORT_TIME); + + // record some and playback + String save = mContext.getString(R.string.btn_save_recording); + String error = mContext.getString(R.string.toast_player_internal_error); + + // save recorder file + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + assertTrue(mSolo.searchButton(save, true)); + mInstrumentation.waitForIdleSync(); + EditText editText = (EditText) mSolo.getView(R.id.fm_recording_text); + mSolo.clearEditText(editText); + mSolo.enterText(editText, "recorder_file"); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, 0); + mSolo.clickOnButton(save); + mSolo.sleep(SHORT_TIME); + + // save recorder file with same name + clickView(mButtonRecord); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + clickView(mButtonStop); + mInstrumentation.waitForIdleSync(); + assertTrue(mSolo.searchButton(save, true)); + mInstrumentation.waitForIdleSync(); + editText = (EditText) mSolo.getView(R.id.fm_recording_text); + mSolo.clearEditText(editText); + mSolo.enterText(editText, "recorder_file"); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager2 = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager2.toggleSoftInput(0, 0); + mSolo.clickOnButton(save); + + // check file has exist + String hasFile = mContext.getString(R.string.already_exists); + assertTrue(mSolo.waitForText(hasFile, 0, SHORT_TIME)); + + // discard save record file + String discard = mFmRadioActivity.getString(R.string.btn_discard_recording); + mSolo.clickOnButton(discard); + mInstrumentation.waitForIdleSync(); +// File sdDir = new File(FmRadioUtils.getInternalStoragePath()); +// File recordingFile = new File(sdDir.getPath() + "/FM Recording", "recorder_file"); + if (recordingFile.exists()) { + recordingFile.delete(); + } + + checkRecordNotSaveIdle(); + } + + // check scan dialog, and fm is powerup sate when recreate + private void checkRelaunchWhenScan() { + Log.d(TAG, ">>> checkRelaunchWhenScan"); + startScanWhenPowerUp(); + //mSolo.sleep(ONE_SECOND); + String cancel = mFmRadioActivity.getString(R.string.btn_cancel); + boolean isVisible = mSolo.searchButton(cancel, true); + assertTrue(isVisible); + + //relaunch after start scan + relaunchFm(); + //mInstrumentation.waitForIdleSync(); + mSolo.sleep(ONE_SECOND); + Log.d(TAG, "current activity:" + mSolo.getCurrentActivity().getComponentName()); + initialRel(); + mSolo.sleep(ONE_SECOND); + //check dialog is shown after relaunch + isVisible = mSolo.searchButton(cancel, true); + assertTrue(isVisible); + Log.d(TAG, "<<< checkRelaunchWhenScan"); + } + + private void relaunchFm() { + mSolo.getCurrentActivity().runOnUiThread(new Runnable() { + + @Override + public void run() { + Log.d(TAG, "sub thread relaunchFm start"); + mSolo.getCurrentActivity().recreate(); + Log.d(TAG, "sub thread relaunchFm end"); + } + }); + } + + private void enterRecordingMode() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + mSolo.sleep(EXECUTE_TIME); + String record = mFmRadioActivity.getString(R.string.optmenu_record); + mSolo.clickOnText(record); + mInstrumentation.waitForIdleSync(); + } + + // check ui and state when no recording file saved. + public void checkRecordNotSaveIdle() { + assertTrue(mButtonRecord.isEnabled()); + assertFalse(mButtonPlayback.isEnabled()); + assertFalse(mButtonStop.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check ui and state while recording. + public void checkRecordingState() { + assertFalse(mButtonRecord.isEnabled()); + assertFalse(mButtonPlayback.isEnabled()); + assertTrue(mButtonStop.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check ui and state when recording stop + public void checkRecordingStopState() { + mButtonRecordSave = (Button) mSolo.getView(R.id.fm_recording_btn_save); + assertTrue(mButtonRecordSave.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check ui and state when save an recording file. + public void checkRecordHasSavedIdle() { + assertTrue(mButtonRecord.isEnabled()); + assertTrue(mButtonPlayback.isEnabled()); + assertFalse(mButtonStop.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check ui and state while playing back an recordfing file. + public void checkPlayingBackState() { + assertFalse(mButtonRecord.isEnabled()); + assertFalse(mButtonPlayback.isEnabled()); + assertTrue(mButtonStop.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check ui and state when play back an recording file finish. + public void checkPlayingBackFinished() { + assertTrue(mButtonRecord.isEnabled()); + assertTrue(mButtonPlayback.isEnabled()); + assertFalse(mButtonStop.isEnabled()); + assertTrue(mButtonAddToFavorite.getVisibility() == View.GONE); + } + + // check state, if cancel scan + public void checkCancelScan() { + mSolo.sleep(SHORT_TIME); + String cancel = mFmRadioActivity.getString(R.string.btn_cancel); + mSolo.clickOnText(cancel); + mInstrumentation.waitForIdleSync(); + int currentStation = (Integer) FmRadioTestCaseUtil + .getVariableFromActivity(mFmRadioActivity, "mCurrentStation"); + assertEquals(currentStation, + FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency)); + mSolo.sleep(SHORT_TIME); + } + + // check state, if finish scan + public void checkFinishScan() { + Log.d(TAG, ">>> checkFinishScan"); + //mInstrumentation.waitForIdleSync(); + mActivityMonitor = mInstrumentation.addMonitor( + FmRadioFavorite.class.getName(), null, false); + Log.d(TAG, "current activity:" + mSolo.getCurrentActivity().getComponentName()); + mFmRadioFavorite = (FmRadioFavorite) mInstrumentation + .waitForMonitorWithTimeout(mActivityMonitor, SEARCH_TIME); + mSolo.sleep(SHORT_TIME); + Log.d(TAG, "mFmRadioFavorite is " + mFmRadioFavorite); + assertNotNull(mFmRadioFavorite); + + // test data in database. + Uri uri = Uri.parse(CONTENTURI); + Cursor c = mFmRadioFavorite.getContentResolver().query( + uri, + new String[] { FmRadioStation.Station._ID, + FmRadioStation.Station.COLUMN_STATION_FREQ, + FmRadioStation.Station.COLUMN_STATION_TYPE }, null, + null, null); + assertTrue(c != null && c.getCount() > 0); + int stationFreq = 0; + int stationType = 0; + if (c != null) { + c.moveToFirst(); + while (!c.isAfterLast()) { + stationFreq = c.getInt(1); + stationType = c.getInt(2); + Log.d(TAG, "station =" + stationFreq); + if (FmRadioStation.STATION_TYPE_SEARCHED == stationType) { + assertTrue(FmRadioTestCaseUtil.isExistInChannelList( + mFmRadioFavorite, stationFreq)); + } + c.moveToNext(); + } + } + if (c != null) { + c.close(); + } + + // click the last station in listview to play. + String pStation = String.valueOf((float) stationFreq / CONVERT_RATE); + mSolo.clickOnText(pStation); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + assertEquals(stationFreq, + FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency)); + + checkFMPlayingState(); + } + + private void switchEarphone() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone); + mSolo.clickOnText(earphone); + mInstrumentation.waitForIdleSync(); + } + + private void switchSpeaker() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker); + mSolo.clickOnText(speaker); + mInstrumentation.waitForIdleSync(); + } + + private void deleteChannelFromFavorite(int station) { + if (FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) { + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + } + } + + private void addChannelAsFavorite(int station) { + if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) { + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + } + + } + + private void makeFMPowerUp() { + boolean isPlaying = false; + isPlaying = (Boolean) FmRadioTestCaseUtil.getVariableFromActivity( + mFmRadioActivity, "mIsPlaying"); + if (!isPlaying) { + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + } + //mInstrumentation.waitForIdleSync(); + mSolo.sleep(TIMEOUT); + } + + private void makeFMPowerDown() { + boolean isPlaying = true; + isPlaying = (Boolean) FmRadioTestCaseUtil.getVariableFromActivity( + mFmRadioActivity, "mIsPlaying"); + if (isPlaying) { + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + } + mInstrumentation.waitForIdleSync(); + mSolo.sleep(SHORT_TIME); + } + + private void clickView(final View view) { + try { + runTestOnUiThread(new Runnable() { + @Override + public void run() { + view.performClick(); + } + }); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + private void waitForInitedWithTimeout(long timeOut) { + long startTime = System.currentTimeMillis(); + boolean isInited = (Boolean) FmRadioTestCaseUtil + .getVariableFromMethod(mFmRadioActivity, "isServiceInited"); + while (!isInited) { + if (System.currentTimeMillis() - startTime > timeOut) { + break; + } + mSolo.sleep(CHECK_TIME); + } + } + + private void waitForPowerupWithTimeout(long timeOut) { + + long startTime = System.currentTimeMillis(); + boolean isPlaying = (Boolean) FmRadioTestCaseUtil + .getVariableFromActivity(mFmRadioActivity, "mIsPlaying"); + while (!isPlaying) { + if (System.currentTimeMillis() - startTime > timeOut) { + break; + } + mSolo.sleep(CHECK_TIME); + } + } + + // start scan when power up state + private void startScanWhenPowerUp() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + mInstrumentation.waitForIdleSync(); + mSolo.sleep(ONE_SECOND); + String search = mFmRadioActivity.getString(R.string.optmenu_search); + mSolo.clickOnText(search); + } + + // check play FM layout button enable + public void checkFMPlayingState() { + assertTrue(mButtonDecrease.isEnabled()); + assertTrue(mButtonIncrease.isEnabled()); + assertTrue(mButtonNextStation.isEnabled()); + assertTrue(mButtonPrevStation.isEnabled()); + + } + + // check play FM layout button enable + public void checkFMStopState() { + assertFalse(mButtonDecrease.isEnabled()); + assertFalse(mButtonPrevStation.isEnabled()); + assertFalse(mButtonNextStation.isEnabled()); + assertFalse(mButtonIncrease.isEnabled()); + } + + public void initialRel() { + mFmRadioActivity = (FmRadioActivity) mSolo.getCurrentActivity(); + mSolo = new Solo(mInstrumentation, mFmRadioActivity); + mContext = mFmRadioActivity.getApplicationContext(); + assertNotNull(mFmRadioActivity); + mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation); + mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation); + mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease); + mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase); + + mButtonAddToFavorite = (ImageButton) mFmRadioActivity + .findViewById(R.id.button_add_to_favorite); + + mTextViewFrequency = (TextView) mFmRadioActivity + .findViewById(R.id.station_value); + } + + @Override + protected void tearDown() { + mSolo.finishOpenedActivities(); + mInstrumentation.waitForIdleSync(); + FmRadioTestCaseUtil.sleep(WAIT_TEAR_DOWN); + try { + mSolo.finalize(); + } catch (Throwable t) { + t.printStackTrace(); + } + try { + super.tearDown(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java new file mode 100755 index 0000000..841a727 --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFavoriteTest.java @@ -0,0 +1,261 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; +import android.app.Instrumentation; +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.TextView; +import android.content.Context; + +import com.jayway.android.robotium.solo.Solo; +import com.mediatek.fmradio.FmRadioActivity; +import com.mediatek.fmradio.FmRadioFavorite; +import com.mediatek.fmradio.FmRadioStation; +import com.mediatek.fmradio.R; + + +public class FmRadioFavoriteTest extends + ActivityInstrumentationTestCase2<FmRadioFavorite> { + private Solo mSolo = null; + private TextView mTextViewFrequency = null; + private FmRadioFavorite mFmRadioFavorite = null; + private FmRadioActivity mFmRadioActivity = null; + private Context mContext = null; + private Instrumentation mInstrumentation = null; + private static final int CONVERT_RATE = 10; + private static final long SLEEP_TIME = 2000; + + public FmRadioFavoriteTest() { + super("com.mediatek.fmradio", FmRadioFavorite.class); + } + @Override + protected void setUp() throws Exception { + super.setUp(); + mSolo = new Solo(getInstrumentation(), getActivity()); + mInstrumentation = getInstrumentation(); + mFmRadioFavorite = (FmRadioFavorite) getActivity(); + mContext = mFmRadioFavorite.getApplicationContext(); + } + public void testCase01_AddToFavorite() { + boolean find = false; + float frequency = 0; + int stationInList = 0; + ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + for (int i = 0; i < listView.getCount(); i++) { + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + if (!FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.add_to_favorite1, R.string.add_to_favorite)); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, 0); + mSolo.clickOnButton(mContext.getString(R.string.btn_ok)); + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); + assertTrue(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)); + return ; + } + } + + } + public void testCase02_EditFavoriteChannel() { + boolean find = false; + float frequency = 0; + int stationInList = 0; + ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + for (int i = 0; i < listView.getCount(); i++) { + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(mContext.getString(R.string.contmenu_item_edit)); + EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_name_text); + mSolo.clearEditText(editText); + mSolo.enterText(editText, "aaa"); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, 0); + mSolo.clickOnButton(mContext.getString(R.string.edit_frequency_overwrite_text)); + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); + assertEquals("aaa", FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE)); + return ; + } + } + } + public void testCase03_DeleteFromFavorite() throws Throwable { + boolean find = false; + float frequency = 0; + int stationInList = 0; + final ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + for (int i = 0; i < listView.getCount(); i++) { + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + runTestOnUiThread(new Runnable() { + @Override + public void run() { + listView.setSelection(0); + } + }); + mSolo.sleep(3000); + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.contmenu_item_delete1, R.string.contmenu_item_delete)); + mInstrumentation.waitForIdleSync(); + mSolo.clickOnButton(mContext.getString(R.string.btn_ok)); + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); + assertFalse(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)); + return ; + } + } + } + + // edit a favorite to a favorite frequency + public void testCase04_EditFavoriteToFavorite() throws Throwable { + boolean find = false; + float frequency = 0; + int stationInList = 0; + String preFavoritaFreq = ""; + ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + int count = listView.getCount(); + for (int i = 0; i < count; i++) { + int favoriateCount = 0; + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + favoriateCount += 1; + preFavoritaFreq = frequencyStr; + } + // add to favoriate + if (!FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(FmRadioTestCaseUtil.getProjectString(mContext, R.string.add_to_favorite1, R.string.add_to_favorite)); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, 0); + mSolo.clickOnButton(mContext.getString(R.string.btn_ok)); + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); + assertTrue(FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)); + // edit favoriate to exist favorite + if (favoriateCount > 0) { + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(mContext.getString(R.string.contmenu_item_edit)); + EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_name_text); + mSolo.clearEditText(editText); + mSolo.enterText(editText, preFavoritaFreq); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager2 = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager2.toggleSoftInput(0, 0); + mSolo.clickOnButton(mContext.getString(R.string.btn_ok)); + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); + assertEquals(preFavoritaFreq, FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE)); + break; + } + } + } + testCase03_DeleteFromFavorite(); + } + + private void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Override + protected void tearDown() throws Exception { + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + try { + mSolo.finalize(); + } catch (Throwable t) { + t.printStackTrace(); + } + super.tearDown(); + } + +} diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java new file mode 100755 index 0000000..7658b2f --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioFunctionRunner.java @@ -0,0 +1,59 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import junit.framework.TestSuite; + +import android.test.InstrumentationTestRunner; +import android.test.InstrumentationTestSuite; + +public class FmRadioFunctionRunner extends InstrumentationTestRunner { + @Override + public TestSuite getAllTests() { + InstrumentationTestSuite suite = new InstrumentationTestSuite(this); + suite.addTestSuite(FmRadioActivityTest.class); + suite.addTestSuite(FmRadioFavoriteTest.class); + return suite; + } + + @Override + public ClassLoader getLoader() { + return FmRadioFunctionRunner.class.getClassLoader(); + } + +} diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java new file mode 100755 index 0000000..828690c --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioLaunchPerformance.java @@ -0,0 +1,59 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import android.app.Activity; +import android.os.Bundle; +import android.test.LaunchPerformanceBase; + +public class FmRadioLaunchPerformance extends LaunchPerformanceBase { + @Override + public void onCreate(Bundle arguments) { + super.onCreate(arguments); + mIntent.setClassName(getTargetContext(), + "com.mediatek.fmradio.FmRadioActivity"); + start(); + } + + @Override + public void onStart() { + super.onStart(); + LaunchApp(); + finish(Activity.RESULT_OK, mResults); + } +}
\ No newline at end of file diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java new file mode 100755 index 0000000..ad25cd4 --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceRunner.java @@ -0,0 +1,57 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import junit.framework.TestSuite; +import android.test.InstrumentationTestRunner; +import android.test.InstrumentationTestSuite; + +public class FmRadioPerformanceRunner extends InstrumentationTestRunner { + @Override + public TestSuite getAllTests() { + InstrumentationTestSuite suite = new InstrumentationTestSuite(this); + suite.addTestSuite(FmRadioPerformanceTest.class); + return suite; + } + + @Override + public ClassLoader getLoader() { + return FmRadioPerformanceRunner.class.getClassLoader(); + } + +} diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java new file mode 100755 index 0000000..7bc3bf0 --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioPerformanceTest.java @@ -0,0 +1,554 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.Context; +import android.media.AudioManager; +import android.test.ActivityInstrumentationTestCase2; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ListAdapter; +import android.widget.TextView; +import android.widget.ListView; +import android.app.Instrumentation.ActivityMonitor; +import com.jayway.android.robotium.solo.Solo; + +import com.mediatek.fmradio.FmRadioActivity; +import com.mediatek.fmradio.FmRadioFavorite; +import com.mediatek.fmradio.FmRadioStation; +import com.mediatek.fmradio.R; + +public class FmRadioPerformanceTest extends ActivityInstrumentationTestCase2<FmRadioActivity> { + + public FmRadioPerformanceTest(Class<FmRadioActivity> activityClass) { + super(activityClass); + } + + public FmRadioPerformanceTest() { + super(FmRadioActivity.class); + } + + private AudioManager mAudioManager = null; + + // bottom bar + private ImageButton mButtonDecrease = null; + private ImageButton mButtonPrevStation = null; + private ImageButton mButtonNextStation = null; + private ImageButton mButtonIncrease = null; +// private ImageButton mButtonPlayStop = null; + + private ImageButton mButtonAddToFavorite = null; + + private TextView mTextViewFrequency = null; + + private static final long TIMEOUT = 5000; + private static final long CHECK_TIME = 100; + private static final long SHORT_TIME = 3000; + private static final long WAIT_UI_STATE_CHANGE = 10000; + private static final long WAIT_SCAN_FINISH = 20000; + private static final long WAIT_TEAR_DOWN = 3000; + private static final long SLEEP_TIME = 2000; + private static final long RDS_TIME_OUT = 10 * 60 * 1000; + private static final int CONVERT_RATE = 10; + private static final int EXECUTE_TIME = 500; + private static final String TAG = "FmRadioPerformanceTest"; + + private FmRadioActivity mFmRadioActivity = null; + private Instrumentation mInstrumentation = null; + private ActivityMonitor mActivityMonitor = null; + private FmRadioFavorite mFmRadioFavorite = null; + private Solo mSolo = null; + + @Override + public void setUp() throws Exception { + super.setUp(); + Log.i(TAG, "setUp"); + setActivityInitialTouchMode(false); + mFmRadioActivity = getActivity(); + assertNotNull(mFmRadioActivity); + mInstrumentation = getInstrumentation(); + assertNotNull(mInstrumentation); + mSolo = new Solo(getInstrumentation(), mFmRadioActivity); + Context mContext = mFmRadioActivity.getApplicationContext(); + mAudioManager = (AudioManager) mFmRadioActivity.getSystemService(mContext.AUDIO_SERVICE); + // Makesure FmRadio is playing and initialed + waitForPowerupWithTimeout(TIMEOUT); + boolean isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying"); + assertTrue(isPlaying); + waitForInitedWithTimeout(TIMEOUT); + boolean isInited = getBooleanFromVariable(mFmRadioActivity, "mIsServiceBinded"); + assertTrue(isInited); + mButtonDecrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_decrease); + mButtonPrevStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_prevstation); + mButtonNextStation = (ImageButton) mFmRadioActivity.findViewById(R.id.button_nextstation); + mButtonIncrease = (ImageButton) mFmRadioActivity.findViewById(R.id.button_increase); +// mButtonPlayStop = (ImageButton) mFmRadioActivity.findViewById(R.id.button_play_stop); + + mButtonAddToFavorite = (ImageButton) mFmRadioActivity.findViewById(R.id.button_add_to_favorite); + mTextViewFrequency = (TextView) mFmRadioActivity.findViewById(R.id.station_value); + } + + + private void waitForInitedWithTimeout(long timeOut) { + Log.i(TAG, ">>>waitForInitedWithTimeout"); + + long startTime = System.currentTimeMillis(); + while (!getBooleanFromVariable(mFmRadioActivity, "mIsServiceBinded")) { + if (System.currentTimeMillis() - startTime > timeOut) { + break; + } + sleep(CHECK_TIME); + } + Log.i(TAG, "<<<waitForInitedWithTimeout"); + + } + + private void waitForPowerupWithTimeout(long timeOut) { + Log.i(TAG, ">>>waitForPowerupWithTimeout"); + + long startTime = System.currentTimeMillis(); + while (!getBooleanFromVariable(mFmRadioActivity, "mIsPlaying")) { + if (System.currentTimeMillis() - startTime > timeOut) { + break; + } + sleep(CHECK_TIME); + } + Log.i(TAG, "<<<waitForPowerupWithTimeout"); + } + + /** + * Test scan channel performance. + */ + public void testCase00_ScanChannelPerformance() throws Exception { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + mInstrumentation.waitForIdleSync(); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP); + mInstrumentation.waitForIdleSync(); + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] scan channel start [" + startTime + "]"); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + sleep(WAIT_SCAN_FINISH); + mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); + sleep(SHORT_TIME); + } + + /** + * Test open channel performance. + */ + /*public void testCase01_ChannelOpenPerformance() throws Exception { + int station = getStationFromUI(); + addChannelAsFavorite(station); + clickView(mButtonIncrease); + sleep(SHORT_TIME); + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_channel_list, 0); + mActivityMonitor = new ActivityMonitor("com.mediatek.fmradio.FmRadioFavorite", null, false); + mInstrumentation.addMonitor(mActivityMonitor); + mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor.waitForActivityWithTimeout(TIMEOUT); + assertNotNull(mFmRadioFavorite); + ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + mSolo.clickOnView(listView.getChildAt(0)); + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] open channel start [" + startTime + "]"); + sleep(WAIT_UI_STATE_CHANGE); + + }*/ + + /** + * Test increase and decrease 0.1 MHz / 0.05 MHZ performance. + */ + public void testCase02_FrequencyChangePerformance() throws Exception { + + // test decrease frequency performance + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] decrease frequency start [" + startTime + "]"); + clickView(mButtonDecrease); + sleep(WAIT_UI_STATE_CHANGE); + + // test increase frequency performance + startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] increase frequency start [" + startTime + "]"); + clickView(mButtonIncrease); + sleep(WAIT_UI_STATE_CHANGE); + + } + + /** + * Test seek channel performance. + */ + public void testCase03_SeekChannelPerformance() throws Exception { + // test seek previous station performance + int stationGap = 0; + int currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity); + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] seek previous channel start [" + startTime + "]"); + clickView(mButtonPrevStation); + sleep(WAIT_UI_STATE_CHANGE); + int searchStation = FmRadioStation.getCurrentStation(mFmRadioActivity); + if (searchStation > currentStation) { + stationGap = searchStation - currentStation; + Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]"); + } else if (searchStation < currentStation) { + stationGap = FmRadioTestCaseUtil.HIGHEST_STATION - currentStation + searchStation - FmRadioTestCaseUtil.LOWEST_STATION; + Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]"); + } else { + Log.e(TAG, "SearchStation Unchanged"); + } + // test seek next station frequency performance + currentStation = FmRadioStation.getCurrentStation(mFmRadioActivity); + startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] seek next channel start [" + startTime + "]"); + clickView(mButtonNextStation); + sleep(WAIT_UI_STATE_CHANGE); + if (searchStation > currentStation) { + stationGap = searchStation - currentStation; + Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]"); + } else if (searchStation < currentStation) { + stationGap = FmRadioTestCaseUtil.HIGHEST_STATION - currentStation + searchStation - FmRadioTestCaseUtil.LOWEST_STATION; + Log.i(TAG, "[Performance test][FmRadio] Test FmRadio seek time stationStep [" + (float) stationGap / CONVERT_RATE + "]"); + } else { + Log.e(TAG, "SearchStation Unchanged"); + } + } + + /** + * Test switch earphone and speaker performance. + */ + public void testCase04_SwitchSpeakerEarphone() throws Exception { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone); + String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker); + + sleep(SHORT_TIME); + // test switch speaker performance + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + mSolo.clickOnText(speaker); + sleep(SHORT_TIME); + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + assertTrue(mSolo.searchText(earphone)); + mInstrumentation.waitForIdleSync(); + + // test switch earphone performance + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + mSolo.clickOnText(earphone); + sleep(SHORT_TIME); + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + assertTrue(mSolo.searchText(speaker)); + } + + /** + * Test power up performance. + */ + public void testCase05_PowerUpPerformance() throws Exception { + if (mButtonDecrease.isEnabled()) { + makeFMPowerDown(); + } + // test power up performance + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] power up start [" + startTime + "]"); +// clickView(mButtonPlayStop); + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + sleep(WAIT_UI_STATE_CHANGE); + } + + /** + * Test get rds performance + * start time: tune to 91.4 finished + * end time: rds information show + */ + public void testCase06_RDSPerformance() { + int station = 0; + // test add channel as favorite + station = FmRadioTestCaseUtil.getStationFromUI(mTextViewFrequency); + if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) { + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + FmRadioTestCaseUtil.sleep(SHORT_TIME); + } + + // enter channel list + mInstrumentation.invokeMenuActionSync(mFmRadioActivity, + R.id.fm_channel_list, 0); + mActivityMonitor = new ActivityMonitor( + "com.mediatek.fmradio.FmRadioFavorite", null, false); + mInstrumentation.addMonitor(mActivityMonitor); + mFmRadioFavorite = (FmRadioFavorite) mActivityMonitor + .waitForActivityWithTimeout(TIMEOUT); + assertNotNull(mFmRadioFavorite); + // edit this station to rds station91.4 + float frequency = 0; + int stationInList = 0; + ListView listView = (ListView) mFmRadioFavorite.findViewById(R.id.station_list); + FmRadioTestCaseUtil.sleep(SLEEP_TIME); + assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + for (int i = 0; i < listView.getCount(); i++) { + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + if (FmRadioStation.isFavoriteStation(mFmRadioFavorite, stationInList)) { + mSolo.clickLongOnText(frequencyStr); + mSolo.clickOnText(mFmRadioFavorite.getString(R.string.contmenu_item_edit)); + EditText editText = (EditText) mSolo.getView(R.id.dlg_edit_station_freq_text); + mSolo.clearEditText(editText); + mSolo.enterText(editText, "91.4"); + mInstrumentation.waitForIdleSync(); + InputMethodManager inputMethodManager = (InputMethodManager) mSolo.getCurrentActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, 0); + if (FmRadioStation.isStationExistInChList(mFmRadioFavorite, 914)) { + mSolo.clickOnText(mFmRadioFavorite.getString(R.string.edit_frequency_overwrite_text)); + } else { + mSolo.clickOnText(mFmRadioFavorite.getString(R.string.btn_ok)); + } + mInstrumentation.waitForIdleSync(); + sleep(SLEEP_TIME); +// assertEquals("aaa", FmRadioStation.getStationName(mFmRadioFavorite, stationInList, FmRadioStation.STATION_TYPE_FAVORITE)); + break; + } + } + + // tune to RDS station 91.4 + mSolo.clickOnText("91.4"); + long startTuneTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] open channel start [" + startTuneTime + "]"); + mInstrumentation.waitForIdleSync(); + // test increase frequency performance + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] receive RDS start [" + startTime + "]"); + + // check RDS info is change + final TextView rdsTextView = (TextView) FmRadioTestCaseUtil.getVariableFromActivity(mFmRadioActivity, "mTextRDS"); + long scapeTime = 0; + while (true) { + String rdsInfo = rdsTextView.getText().toString(); + if (!"".equals(rdsInfo)) { + long endTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] receive RDS end [" + endTime + "]"); + break; + } + try { + scapeTime = System.currentTimeMillis() - startTime; + sleep(CHECK_TIME); + } catch (Exception e) { + } + // if time > 10min, end time will be 10min + if (scapeTime > RDS_TIME_OUT) { + long endTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] receive RDS end [" + endTime + "]"); + break; + } + } + } + + public void testCase07_PowerDownPerformance() throws Exception { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + // test power down performance + long startTime = System.currentTimeMillis(); + Log.i(TAG, "[Performance test][FmRadio] power down start [" + startTime + "]"); + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + sleep(WAIT_UI_STATE_CHANGE); + } + + private void makeFMPowerUp() { + boolean isPlaying = false; + isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying"); + if (!isPlaying) { + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_power, 0); + } + sleep(WAIT_UI_STATE_CHANGE); + + } + + private void makeFMPowerDown() { + boolean isPlaying = true; + isPlaying = getBooleanFromVariable(mFmRadioActivity, "mIsPlaying"); + if (isPlaying) { + FmRadioTestCaseUtil.requestFocusGain(mAudioManager); + } + sleep(WAIT_UI_STATE_CHANGE); + + } + + private void switchEarphone() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + String earphone = mFmRadioActivity.getString(R.string.optmenu_earphone); + mSolo.clickOnText(earphone); + mInstrumentation.waitForIdleSync(); + } + + private void switchSpeaker() { + if (!mButtonDecrease.isEnabled()) { + makeFMPowerUp(); + } + mInstrumentation + .invokeMenuActionSync(mFmRadioActivity, R.id.fm_menu, 0); + String speaker = mFmRadioActivity.getString(R.string.optmenu_speaker); + mSolo.clickOnText(speaker); + mInstrumentation.waitForIdleSync(); + + } + + private boolean getBooleanFromVariable(Activity activity, String variable) { + Field field = null; + boolean value = false; + try { + field = FmRadioActivity.class.getDeclaredField(variable); + field.setAccessible(true); + value = ((Boolean) field.get(activity)).booleanValue(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return value; + } + + private boolean getBooleanFromMethod(Activity activity, String method) { + + boolean value = false; + Class c = mFmRadioActivity.getClass(); + try { + Method m = (Method) c.getDeclaredMethod(method, new Class[] {}); + m.setAccessible(true); + value = (Boolean) m.invoke(activity, new Object[] {}); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return value; + } + + private void clickView(final View view) { + try { + runTestOnUiThread(new Runnable() { + public void run() { + view.performClick(); + + } + }); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + private void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void addChannelAsFavorite(int station) { + if (!FmRadioStation.isFavoriteStation(mFmRadioActivity, station)) { + clickView(mButtonAddToFavorite); + mInstrumentation.waitForIdleSync(); + sleep(SHORT_TIME); + } + + } + + private int getStationFromUI() { + int station = 0; + float frequency = 0; + mTextViewFrequency = (TextView) mFmRadioActivity.findViewById(R.id.station_value); + String frequencyStr = mTextViewFrequency.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + station = (int) (frequency * CONVERT_RATE); + return station; + + } + + @Override + public void tearDown() throws Exception { + Log.i(TAG, "tearDown"); + try { + mSolo.finalize(); + } catch (Throwable t) { + t.printStackTrace(); + } + mSolo.finishOpenedActivities(); + sleep(WAIT_TEAR_DOWN); + super.tearDown(); + } + + +} diff --git a/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java new file mode 100755 index 0000000..f34a8c1 --- /dev/null +++ b/MediaTek/FmRadio/tests/src/com/mediatek/fmradio/tests/FmRadioTestCaseUtil.java @@ -0,0 +1,219 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio.tests; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import android.app.Activity; +import android.content.Context; +import android.media.AudioManager; +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.util.Log; +import android.view.View; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.TextView; +import junit.framework.Assert; +//import com.mediatek.storage.StorageManagerEx; +import com.mediatek.fmradio.FmRadioActivity; +import com.mediatek.fmradio.R; + +public class FmRadioTestCaseUtil { + // FM station variables + public static final int DEFAULT_STATION = 1000; + // maximum station frequency + public static final int HIGHEST_STATION = 1080; + // minimum station frequency + public static final int LOWEST_STATION = 875; + + // minimum storage space for record + public static final long LOW_SPACE_THRESHOLD = 512 * 1024; + + public static final int CONVERT_RATE = 10; + public static final long CHECK_TIME = 200; + public static final String OP = android.os.SystemProperties.get("ro.operator.optr"); + public static final boolean IS_CMCC = ("OP01").equals(OP); // whether is CMCC project + private static final String TAG = "FmRadioTestCaseUtil"; + + // check station is in channel list. + public static boolean isExistInChannelList(Activity activity, int station) { + + boolean find = false; + float frequency = 0; + int stationInList = 0; + ListView listView = (ListView) activity.findViewById(R.id.station_list); + sleep(CHECK_TIME); + Assert.assertTrue((listView != null) && (listView.getCount() > 0)); + ListAdapter listAdapter = listView.getAdapter(); + int stationCount = listView.getCount(); + Log.d(TAG, "isExistInChannelList stationCount:" + stationCount); + for (int i = 0; i < stationCount; i++) { + View view = listAdapter.getView(i, null, listView); + TextView textView = (TextView) view.findViewById(R.id.lv_station_freq); + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + stationInList = (int) (frequency * CONVERT_RATE); + Log.d(TAG, "isExistInChannelList i:" + i + ", frequencyStr:" + frequencyStr + + ", stationInList:" + stationInList); + if (station == stationInList) { + return true; + } + } + return false; + } + + // get station fraom UI. + public static int getStationFromUI(TextView textView) { + int station = 0; + float frequency = 0; + String frequencyStr = textView.getText().toString(); + try { + frequency = Float.parseFloat(frequencyStr); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + station = (int) (frequency * CONVERT_RATE); + return station; + } + + // sleep + public static void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + // get variable from method. + public static Object getVariableFromMethod(Activity activity, String method) { + Object value = false; + Class c = activity.getClass(); + try { + Method m = (Method) c.getDeclaredMethod(method, new Class[] {}); + m.setAccessible(true); + value = m.invoke(activity, new Object[] {}); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return value; + } + + // get variable from activity. + public static Object getVariableFromActivity(Activity activity, String variable) { + Field field = null; + Object value = null; + try { + field = FmRadioActivity.class.getDeclaredField(variable); + field.setAccessible(true); + value = field.get(activity); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return value; + } + + public static String getProjectString(Context context, int cmccResId, int normalResId) { + return IS_CMCC ? context.getString(cmccResId) : context.getString(normalResId); + } + +// public static void mountSDCard(Context context) { +// try { +// getMountService().mountVolume(StorageManagerEx.getDefaultPath()); +// } catch (RemoteException e) { +// } +// } + +// public static void unmountSDCard(Context context) { +// try { +// getMountService().unmountVolume(StorageManagerEx.getDefaultPath(), +// true, false); +// } catch (RemoteException e) { +// } +// } +// +// private static IMountService getMountService() { +// IMountService mountService = null; +// IBinder service = ServiceManager.getService("mount"); +// Assert.assertNotNull(service); +// mountService = IMountService.Stub.asInterface(service); +// return mountService; +// } + + private static OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() { + public void onAudioFocusChange(int focusChange) { + switch (focusChange) { + case AudioManager.AUDIOFOCUS_LOSS: + Log.d(TAG, "request audio focus loss"); + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + Log.d(TAG, "request audio focus loss transient"); + break; + case AudioManager.AUDIOFOCUS_GAIN: + Log.d(TAG, "request audio focus gain"); + break; + default : + break; + } + } + }; + public static void requestFocusGain(AudioManager audioManager) { + audioManager.requestAudioFocus(mAudioFocusListener, + AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); + } +} diff --git a/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java b/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java new file mode 100755 index 0000000..d560f17 --- /dev/null +++ b/MediaTek/FmRadio/turnkey/com/mediatek/fmradio/ExtensionUtils.java @@ -0,0 +1,67 @@ +/* Copyright Statement: + * + * This software/firmware and related documentation ("MediaTek Software") are + * protected under relevant copyright laws. The information contained herein is + * confidential and proprietary to MediaTek Inc. and/or its licensors. Without + * the prior written permission of MediaTek inc. and/or its licensors, any + * reproduction, modification, use or disclosure of MediaTek Software, and + * information contained herein, in whole or in part, shall be strictly + * prohibited. + * + * MediaTek Inc. (C) 2010. All rights reserved. + * + * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES + * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") + * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER + * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL + * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH + * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, + * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES + * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. + * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO + * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK + * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE + * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR + * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S + * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE + * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE + * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE + * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. + * + * The following software/firmware and/or related documentation ("MediaTek + * Software") have been modified by MediaTek Inc. All revisions are subject to + * any receiver's applicable license agreements with MediaTek Inc. + */ + +package com.mediatek.fmradio; + +import android.content.Context; + +import com.mediatek.common.MPlugin; +import com.mediatek.fmradio.ext.IProjectStringExt; +import com.mediatek.fmradio.ext.DefaultProjectStringExt; + +/** + * get plugin instance. + */ +public class ExtensionUtils { + /** + * get IProjectStringExt instance. + */ + public static IProjectStringExt getExtension( + Context context) { + IProjectStringExt ext = null; + try { + ext = (IProjectStringExt) MPlugin.createInstance(IProjectStringExt.class.getName(), + context); + } finally { + if (ext == null) { + ext = new DefaultProjectStringExt(); + } + } + + return ext; + } +} |
