diff --git a/BoardConfig.mk b/BoardConfig.mk index 04f7e60..197671a 100644 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -35,6 +35,7 @@ TARGET_USES_16BPPSURFACE_FOR_OPAQUE := true ARCH_ARM_HAVE_32_BYTE_CACHE_LINES := true TARGET_USES_ION := false +BOARD_HAVE_OLD_ION_API := true TARGET_BOOTLOADER_BOARD_NAME := u8815 TARGET_OTA_ASSERT_DEVICE := u8815,hwu8815,u8818,hwu8818 @@ -42,14 +43,16 @@ TARGET_OTA_ASSERT_DEVICE := u8815,hwu8815,u8818,hwu8818 TARGET_SPECIFIC_HEADER_PATH := device/huawei/u8815/include # Audio +TARGET_QCOM_AUDIO_VARIANT := caf TARGET_PROVIDES_LIBAUDIO := true + # Lights TARGET_PROVIDES_LIBLIGHTS := true # Camera BOARD_NEEDS_MEMORYHEAPPMEM := true -COMMON_GLOBAL_CFLAGS += -DICS_CAMERA_BLOB +COMMON_GLOBAL_CFLAGS += -DICS_CAMERA_BLOB -DQCOM_VOIP_ENABLED # GPS BOARD_USES_QCOM_GPS := true diff --git a/audio/Android.mk b/audio/Android.mk index 85ea7cd..928cdaf 100644 --- a/audio/Android.mk +++ b/audio/Android.mk @@ -8,17 +8,10 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ + AudioHardware.cpp \ audio_hw_hal.cpp \ HardwarePinSwitching.c -ifeq ($(strip $(TARGET_HAS_QACT)),true) -LOCAL_SRC_FILES += \ - AudioHardware_cad.cpp -else -LOCAL_SRC_FILES += \ - AudioHardware.cpp -endif - ifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_CFLAGS += -DWITH_A2DP endif @@ -36,20 +29,42 @@ ifeq ($(strip $(BOARD_USES_SRS_TRUEMEDIA)),true) LOCAL_CFLAGS += -DSRS_PROCESSING endif +ifeq ($(BOARD_USES_QCOM_AUDIO_LPA),true) + LOCAL_CFLAGS += -DQCOM_TUNNEL_LPA_ENABLED +endif + +ifeq ($(BOARD_USES_QCOM_AUDIO_SPEECH),true) + LOCAL_CFLAGS += -DWITH_QCOM_SPEECH +endif + +ifeq ($(BOARD_USES_QCOM_AUDIO_VOIPMUTE),true) + LOCAL_CFLAGS += -DWITH_QCOM_VOIPMUTE +endif + +ifeq ($(BOARD_USES_QCOM_AUDIO_RESETALL),true) + LOCAL_CFLAGS += -DWITH_QCOM_RESETALL +endif + LOCAL_CFLAGS += -DQCOM_VOIP_ENABLED LOCAL_CFLAGS += -DQCOM_TUNNEL_LPA_ENABLED LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ - libmedia + libmedia \ + libaudioalsa + +# hack for prebuilt +$(shell mkdir -p $(OUT)/obj/SHARED_LIBRARIES/libaudioalsa_intermediates/) +$(shell touch $(OUT)/obj/SHARED_LIBRARIES/libaudioalsa_intermediates/export_includes) ifneq ($(TARGET_SIMULATOR),true) LOCAL_SHARED_LIBRARIES += libdl endif -ifeq ($(strip $(TARGET_HAS_QACT)),true) -LOCAL_SHARED_LIBRARIES += libaudcal +ifeq ($(BOARD_USES_QCOM_AUDIO_CALIBRATION),true) + LOCAL_SHARED_LIBRARIES += libaudcal + LOCAL_CFLAGS += -DWITH_QCOM_CALIBRATION endif LOCAL_STATIC_LIBRARIES := \ @@ -63,14 +78,16 @@ LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS += -fno-short-enums LOCAL_C_INCLUDES := $(TARGET_OUT_HEADERS)/mm-audio/audio-alsa -LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/audcal +ifeq ($(BOARD_USES_QCOM_AUDIO_CALIBRATION),true) + LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/audcal +endif LOCAL_C_INCLUDES += hardware/libhardware/include LOCAL_C_INCLUDES += hardware/libhardware_legacy/include LOCAL_C_INCLUDES += frameworks/base/include LOCAL_C_INCLUDES += system/core/include -#LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -#LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) @@ -101,8 +118,17 @@ endif LOCAL_C_INCLUDES := hardware/libhardware_legacy/audio -#LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -#LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) + +# Load audio_policy.conf to system/etc/ +include $(CLEAR_VARS) +LOCAL_MODULE := audio_policy.conf +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) +LOCAL_SRC_FILES := audio_policy.conf +include $(BUILD_PREBUILT) endif # TARGET_BOOTLOADER_BOARD_NAME diff --git a/audio/AudioHardware.cpp b/audio/AudioHardware.cpp index 3374766..b664a58 100644 --- a/audio/AudioHardware.cpp +++ b/audio/AudioHardware.cpp @@ -40,8 +40,11 @@ extern "C" { #endif //#include +#ifdef WITH_QCOM_VOIP_OVER_MVS +#include +#endif -//#define COMBO_DEVICE_SUPPORTED // Headset speaker combo device not supported on this target +#define COMBO_DEVICE_SUPPORTED // Headset speaker combo device not supported on this target #define DUALMIC_KEY "dualmic_enabled" #define TTY_MODE_KEY "tty_mode" #define ECHO_SUPRESSION "ec_supported" @@ -409,7 +412,7 @@ AudioStreamIn* AudioHardware::openInputStream( mLock.lock(); #ifdef QCOM_VOIP_ENABLED - if(devices == AudioSystem::DEVICE_IN_COMMUNICATION) { + if ((devices == AudioSystem::DEVICE_IN_COMMUNICATION) && (*sampleRate == 8000)) { ALOGV("Create Audio stream Voip \n"); AudioStreamInVoip* inVoip = new AudioStreamInVoip(); status_t lStatus = NO_ERROR; @@ -646,7 +649,7 @@ status_t AudioHardware::setParameters(const String8& keyValuePairs) } #ifdef QCOM_VOIP_ENABLED -uint32_t AudioHardware::getMvsMode(int format) +uint32_t AudioHardware::getMvsMode(int format, int rate) { switch(format) { case AudioSystem::PCM_16_BIT: @@ -1575,8 +1578,11 @@ status_t AudioHardware::setVoiceVolume(float v) ALOGW("setVoiceVolume(%f) over 1.0, assuming 1.0\n", v); v = 1.0; } + // Added 0.4 to current volume, as in voice call Mute cannot be set as minimum volume(0.00) + // setting Rx volume level as 2 for minimum and 7 as max level. + v = 0.4 + v; - int vol = lrint(v * 7.0); + int vol = lrint(v * 5.0); ALOGD("setVoiceVolume(%f)\n", v); ALOGI("Setting in-call volume to %d (available range is 2 to 7)\n", vol); @@ -2055,9 +2061,14 @@ AudioHardware::AudioStreamInMSM72xx *AudioHardware::getActiveInput_l() #ifdef QCOM_VOIP_ENABLED status_t AudioHardware::setupDeviceforVoipCall(bool value) { + ALOGV("setupDeviceforVoipCall value %d",value); + if (mMode == AudioSystem::MODE_IN_CALL && value == false) { + ALOGE("mode already set for voice call, do not change to normal"); + return NO_ERROR; + } int mode = (value ? AudioSystem::MODE_IN_COMMUNICATION : AudioSystem::MODE_NORMAL); - if (setMode(mode) != NO_ERROR) { + if (setMode(mode) == BAD_VALUE) { ALOGV("setMode fails"); return UNKNOWN_ERROR; } @@ -2093,7 +2104,7 @@ status_t AudioHardware::AudioStreamInVoip::set( { ALOGD("AudioStreamInVoip::set devices = %u format = %x pChannels = %u Rate = %u \n", devices, *pFormat, *pChannels, *pRate); - if ((pFormat == 0) || BAD_INDEX == hw->getMvsMode(*pFormat)) { + if ((pFormat == 0) || BAD_INDEX == hw->getMvsMode(*pFormat, *pRate)) { ALOGE("Audio Format (%x) not supported \n",*pFormat); return BAD_VALUE; } @@ -2156,7 +2167,7 @@ status_t AudioHardware::AudioStreamInVoip::set( goto Error; } - mvs_config.mvs_mode = mHardware->getMvsMode(*pFormat); + mvs_config.mvs_mode = mHardware->getMvsMode(*pFormat, *pRate); status = mHardware->getMvsRateType(mvs_config.mvs_mode ,&mvs_config.rate_type); ALOGD("set mvs config mode %d rate_type %d", mvs_config.mvs_mode, mvs_config.rate_type); if (status < 0) { @@ -2604,7 +2615,7 @@ status_t AudioHardware::AudioStreamOutMSM72xx::setParameters(const String8& keyV if (param.getInt(key, device) == NO_ERROR) { mDevices = device; ALOGV("set output routing %x", mDevices); - status = mHardware->doRouting(NULL); + status = mHardware->doRouting(NULL, device); param.remove(key); } @@ -2649,10 +2660,10 @@ status_t AudioHardware::AudioStreamOutDirect::set( uint32_t lChannels = pChannels ? *pChannels : 0; uint32_t lRate = pRate ? *pRate : 0; - ALOGD("set lFormat = %x lChannels= %u lRate = %u\n", + ALOGD("AudioStreamOutDirect::set lFormat = %x lChannels= %u lRate = %u\n", lFormat, lChannels, lRate ); - if ((pFormat == 0) || BAD_INDEX == hw->getMvsMode(*pFormat)) { + if ((pFormat == 0) || BAD_INDEX == hw->getMvsMode(*pFormat, lRate)) { ALOGE("Audio Format (%x) not supported \n",*pFormat); return BAD_VALUE; } @@ -2666,11 +2677,9 @@ status_t AudioHardware::AudioStreamOutDirect::set( // check values if ((lFormat != format()) || - (lChannels != channels()) || - (lRate != sampleRate())) { + (lChannels != channels())) { if (pFormat) *pFormat = format(); if (pChannels) *pChannels = channels(); - if (pRate) *pRate = sampleRate(); ALOGE(" AudioStreamOutDirect::set return bad values\n"); return BAD_VALUE; } @@ -2748,7 +2757,7 @@ ssize_t AudioHardware::AudioStreamOutDirect::write(const void* buffer, size_t by goto Error; } - mvs_config.mvs_mode = mHardware->getMvsMode(mFormat); + mvs_config.mvs_mode = mHardware->getMvsMode(mFormat, mSampleRate); status = mHardware->getMvsRateType(mvs_config.mvs_mode ,&mvs_config.rate_type); ALOGD("set mvs config mode %d rate_type %d", mvs_config.mvs_mode, mvs_config.rate_type); if (status < 0) { diff --git a/audio/AudioHardware.h b/audio/AudioHardware.h index a2fcf30..91ef152 100644 --- a/audio/AudioHardware.h +++ b/audio/AudioHardware.h @@ -238,7 +238,7 @@ class AudioHardware : public AudioHardwareBase #endif protected: virtual status_t dump(int fd, const Vector& args); - uint32_t getMvsMode(int format); + uint32_t getMvsMode(int format, int rate); uint32_t getMvsRateType(uint32_t MvsMode, uint32_t *rateType); status_t setupDeviceforVoipCall(bool value); @@ -322,11 +322,11 @@ class AudioHardware : public AudioHardwareBase int *pFormat, uint32_t *pChannels, uint32_t *pRate); - virtual uint32_t sampleRate() const {ALOGD(" AudioStreamOutDirect: SampleRate %d\n",mSampleRate); return mSampleRate; } + virtual uint32_t sampleRate() const { ALOGE(" AudioStreamOutDirect: sampleRate\n"); return 8000; } // must be 32-bit aligned - driver only seems to like 4800 - virtual size_t bufferSize() const { ALOGD(" AudioStreamOutDirect: bufferSize %d\n",mBufferSize);return mBufferSize; } - virtual uint32_t channels() const {ALOGD(" AudioStreamOutDirect: channels %d\n",mChannels); return mChannels; } - virtual int format() const {ALOGD(" AudioStreamOutDirect: format %d\n",mFormat);return mFormat; } + virtual size_t bufferSize() const { ALOGE(" AudioStreamOutDirect: bufferSize\n"); return 320; } + virtual uint32_t channels() const {ALOGD(" AudioStreamOutDirect: channels\n"); return mChannels; } + virtual int format() const {ALOGE(" AudioStreamOutDirect: format\n"); return AudioSystem::PCM_16_BIT; } virtual uint32_t latency() const { return (1000*AUDIO_HW_NUM_OUT_BUF*(bufferSize()/frameSize()))/sampleRate()+AUDIO_HW_OUT_LATENCY_MS; } virtual status_t setVolume(float left, float right) { return INVALID_OPERATION; } virtual ssize_t write(const void* buffer, size_t bytes); @@ -559,7 +559,7 @@ class AudioSessionOutLPA : public AudioStreamOut uint32_t *pChannels, uint32_t *pRate, AudioSystem::audio_in_acoustics acoustics); - virtual size_t bufferSize() const { return 320; } + virtual size_t bufferSize() const { return mBufferSize; } virtual uint32_t channels() const {ALOGD(" AudioStreamInVoip: channels %d \n",mChannels); return mChannels; } virtual int format() const { return AUDIO_HW_IN_FORMAT; } virtual uint32_t sampleRate() const { return 8000; } diff --git a/audio/AudioPolicyManager.cpp b/audio/AudioPolicyManager.cpp index 096957d..b0e18a9 100644 --- a/audio/AudioPolicyManager.cpp +++ b/audio/AudioPolicyManager.cpp @@ -807,10 +807,7 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManager::getProfileForDirectOutput uint32_t channelMask, audio_output_flags_t flags) { - if( !((flags & AUDIO_OUTPUT_FLAG_LPA) || - (flags & AUDIO_OUTPUT_FLAG_TUNNEL)|| - (flags & AUDIO_OUTPUT_FLAG_VOIP_RX)) ) - flags = AUDIO_OUTPUT_FLAG_DIRECT; + for (size_t i = 0; i < mHwModules.size(); i++) { if (mHwModules[i]->mHandle == 0) { @@ -820,7 +817,7 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManager::getProfileForDirectOutput AudioPolicyManagerBase::IOProfile *profile = mHwModules[i]->mOutputProfiles[j]; if (isCompatibleProfile(profile, device, samplingRate, format, channelMask, - flags)) { + (audio_output_flags_t)(flags|AUDIO_OUTPUT_FLAG_DIRECT))) { if (mAvailableOutputDevices & profile->mSupportedDevices) { return mHwModules[i]->mOutputProfiles[j]; } @@ -1104,7 +1101,7 @@ audio_devices_t AudioPolicyManager::getDeviceForInputSource(int inputSource) } break; case AUDIO_SOURCE_VOICE_COMMUNICATION: - device = AudioSystem::DEVICE_IN_COMMUNICATION; + device = AUDIO_DEVICE_IN_COMMUNICATION; break; case AUDIO_SOURCE_CAMCORDER: if (mAvailableInputDevices & AUDIO_DEVICE_IN_BACK_MIC) { @@ -1310,8 +1307,8 @@ uint32_t AudioPolicyManager::setOutputDevice(audio_io_handle_t output, audio_dev // - the requested device is 0 // - the requested device is the same as current device and force is not specified. // Doing this check here allows the caller to call setOutputDevice() without conditions - if ((device == 0 || device == prevDevice) && !force) { - ALOGV("setOutputDevice() setting same device %04x or null device for output %d", device, output); + if (device == 0) { + ALOGV("setOutputDevice() setting null device for output %d", output); return muteWaitMs; } diff --git a/audio/audio_policy.conf b/audio/audio_policy.conf new file mode 100644 index 0000000..de5ba88 --- /dev/null +++ b/audio/audio_policy.conf @@ -0,0 +1,77 @@ +# +# Audio policy configuration for generic device builds (goldfish audio HAL - emulator) +# + +# Global configuration section: lists input and output devices always present on the device +# as well as the output device selected by default. +# Devices are designated by a string that corresponds to the enum in audio.h + +global_configuration { + attached_output_devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE + default_output_device AUDIO_DEVICE_OUT_SPEAKER + attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_VOICE_CALL +} + +# audio hardware module section: contains descriptors for all audio hw modules present on the +# device. Each hw module node is named after the corresponding hw module library base name. +# For instance, "primary" corresponds to audio.primary..so. +# The "primary" module is mandatory and must include at least one output with +# AUDIO_OUTPUT_FLAG_PRIMARY flag. +# Each module descriptor contains one or more output profile descriptors and zero or more +# input profile descriptors. Each profile lists all the parameters supported by a given output +# or input stream category. +# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding +# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n". + +audio_hw_modules { + primary { + outputs { + primary { + sampling_rates 44100|48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_AUX_DIGITAL|AUDIO_DEVICE_OUT_FM|AUDIO_DEVICE_OUT_FM_TX + flags AUDIO_OUTPUT_FLAG_PRIMARY + } + voipout { + sampling_rates 8000|16000 + channel_masks AUDIO_CHANNEL_OUT_MONO + formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_AMR_NB|AUDIO_FORMAT_AMR_WB|AUDIO_FORMAT_QCELP|AUDIO_FORMAT_EVRC|AUDIO_FORMAT_EVRCB|AUDIO_FORMAT_EVRCWB + devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE + flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_VOIP_RX + } + lpa { + sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_MONO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_AUX_DIGITAL + flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_LPA + } + } + inputs { + primary { + sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_VOICE_CALL_MONO|AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO|AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO + formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_AMR_NB|AUDIO_FORMAT_EVRC|AUDIO_FORMAT_QCELP + devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_AUX_DIGITAL|AUDIO_DEVICE_IN_VOICE_CALL|AUDIO_DEVICE_IN_FM_RX + } + voipin { + sampling_rates 8000|16000 + channel_masks AUDIO_CHANNEL_IN_MONO + formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_AMR_NB|AUDIO_FORMAT_AMR_WB|AUDIO_FORMAT_QCELP|AUDIO_FORMAT_EVRC|AUDIO_FORMAT_EVRCB|AUDIO_FORMAT_EVRCWB + devices AUDIO_DEVICE_IN_COMMUNICATION + } + } + } + a2dp { + outputs { + primary { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_ALL_A2DP + flags AUDIO_OUTPUT_FLAG_PRIMARY + } + } + } +} diff --git a/audio/audio_policy_hal.cpp b/audio/audio_policy_hal.cpp index b3263c9..5c93b5c 100644 --- a/audio/audio_policy_hal.cpp +++ b/audio/audio_policy_hal.cpp @@ -69,7 +69,7 @@ static int ap_set_device_connection_state(struct audio_policy *pol, { struct qcom_audio_policy *qap = to_qap(pol); return qap->apm->setDeviceConnectionState( - (AudioSystem::audio_devices)device, + device, (AudioSystem::device_connection_state)state, device_address); } @@ -81,7 +81,7 @@ static audio_policy_dev_state_t ap_get_device_connection_state( { const struct qcom_audio_policy *qap = to_cqap(pol); return (audio_policy_dev_state_t)qap->apm->getDeviceConnectionState( - (AudioSystem::audio_devices)device, + device, device_address); } @@ -289,7 +289,7 @@ static int ap_get_stream_volume_index_for_device(const struct audio_policy *pol, const struct qcom_audio_policy *qap = to_cqap(pol); return qap->apm->getStreamVolumeIndex((AudioSystem::stream_type)stream, index, - device); + AUDIO_DEVICE_OUT_DEFAULT); } static audio_devices_t ap_get_devices_for_stream(const struct audio_policy *pol, diff --git a/cm.mk b/cm.mk index 818a494..5c7cb76 100644 --- a/cm.mk +++ b/cm.mk @@ -22,4 +22,4 @@ PRODUCT_MODEL := Ascend G300 PRODUCT_MANUFACTURER := HUAWEI # Set build fingerprint / ID / Product Name ect. -PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=U8815 BUILD_ID=JOP40C BUILD_FINGERPRINT=ZTE/N880E_JB4_2/atlas40:4.2/JOP40C/20121121.110335:user/release-keys PRIVATE_BUILD_DESC="N880E_JB4_2-user 4.2 JOP40C 20121121.110335 release-keys" BUILD_NUMBER=20121121.110335 +PRODUCT_BUILD_PROP_OVERRIDES += PRODUCT_NAME=U8815 BUILD_HOST=localhost