diff options
38 files changed, 1522 insertions, 138 deletions
diff --git a/api/current.txt b/api/current.txt index 630ab00..68fb4bc 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10813,8 +10813,6 @@ package android.media { ctor public MediaRecorder(); method public static final int getAudioSourceMax(); method public int getMaxAmplitude() throws java.lang.IllegalStateException; - method public void native_start() throws java.lang.IllegalStateException; - method public void native_stop() throws java.lang.IllegalStateException; method public void prepare() throws java.io.IOException, java.lang.IllegalStateException; method public void release(); method public void reset(); @@ -10853,13 +10851,9 @@ package android.media { public final class MediaRecorder.AudioEncoder { field public static final int AAC = 3; // 0x3 - field public static final int AAC_PLUS = 4; // 0x4 field public static final int AMR_NB = 1; // 0x1 field public static final int AMR_WB = 2; // 0x2 field public static final int DEFAULT = 0; // 0x0 - field public static final int EAAC_PLUS = 5; // 0x5 - field public static final int EVRC = 6; // 0x6 - field public static final int QCELP = 7; // 0x7 } public final class MediaRecorder.AudioSource { @@ -10886,10 +10880,8 @@ package android.media { field public static final int AMR_WB = 4; // 0x4 field public static final int DEFAULT = 0; // 0x0 field public static final int MPEG_4 = 2; // 0x2 - field public static final int QCP = 9; // 0x9 field public static final int RAW_AMR = 3; // 0x3 field public static final int THREE_GPP = 1; // 0x1 - field public static final int THREE_GPP2 = 10; // 0xa } public final class MediaRecorder.VideoEncoder { @@ -22208,9 +22200,6 @@ package android.view { field public static final int KEYCODE_BACKSLASH = 73; // 0x49 field public static final int KEYCODE_BOOKMARK = 174; // 0xae field public static final int KEYCODE_BREAK = 121; // 0x79 - field public static final int KEYCODE_BRIGHTNESS_AUTO = 216; // 0xd8 - field public static final int KEYCODE_BRIGHTNESS_DOWN = 214; // 0xd6 - field public static final int KEYCODE_BRIGHTNESS_UP = 215; // 0xd7 field public static final int KEYCODE_BUTTON_1 = 188; // 0xbc field public static final int KEYCODE_BUTTON_10 = 197; // 0xc5 field public static final int KEYCODE_BUTTON_11 = 198; // 0xc6 @@ -22364,7 +22353,6 @@ package android.view { field public static final int KEYCODE_R = 46; // 0x2e field public static final int KEYCODE_RIGHT_BRACKET = 72; // 0x48 field public static final int KEYCODE_S = 47; // 0x2f - field public static final int KEYCODE_SCREENSHOT = 217; // 0xd9 field public static final int KEYCODE_SCROLL_LOCK = 116; // 0x74 field public static final int KEYCODE_SEARCH = 84; // 0x54 field public static final int KEYCODE_SEMICOLON = 74; // 0x4a @@ -22383,9 +22371,6 @@ package android.view { field public static final int KEYCODE_SYSRQ = 120; // 0x78 field public static final int KEYCODE_T = 48; // 0x30 field public static final int KEYCODE_TAB = 61; // 0x3d - field public static final int KEYCODE_TOGGLE_BT = 212; // 0xd4 - field public static final int KEYCODE_TOGGLE_TOUCHPAD = 213; // 0xd5 - field public static final int KEYCODE_TOGGLE_WIFI = 211; // 0xd3 field public static final int KEYCODE_TV = 170; // 0xaa field public static final int KEYCODE_TV_INPUT = 178; // 0xb2 field public static final int KEYCODE_TV_POWER = 177; // 0xb1 diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c index 5c9a8b3..1bd21a6 100644 --- a/cmds/servicemanager/service_manager.c +++ b/cmds/servicemanager/service_manager.c @@ -37,6 +37,7 @@ static struct { #ifdef YAMAHAPLAYER { AID_MEDIA, "media.yamahaplayer" }, #endif + { AID_MEDIA, "media.nvidia.audio_alsa" }, #ifdef SECTVOUT { AID_MEDIA, "SecTVOutService" }, #endif diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 86725ac..0b1dc44 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -1656,7 +1656,7 @@ public class Camera { private static final String KEY_SCENE_DETECT = "scene-detect"; private static final String KEY_FLASH_MODE = "flash-mode"; private static final String KEY_FOCUS_MODE = "focus-mode"; - private static final String KEY_ISO_MODE = "iso"; + private static final String KEY_ISO_MODE = "iso"; private static final String KEY_LENSSHADE = "lensshade"; private static final String KEY_HISTOGRAM = "histogram"; private static final String KEY_SKIN_TONE_ENHANCEMENT = "skinToneEnhancement"; @@ -1703,7 +1703,7 @@ public class Camera { private static final String KEY_SELECTABLE_ZONE_AF = "selectable-zone-af"; private static final String KEY_FACE_DETECTION = "face-detection"; private static final String KEY_MEMORY_COLOR_ENHANCEMENT = "mce"; - private static final String KEY_REDEYE_REDUCTION = "redeye-reduction"; + private static final String KEY_REDEYE_REDUCTION = "redeye-reduction"; private static final String KEY_ZSL = "zsl"; private static final String KEY_CAMERA_MODE = "camera-mode"; private static final String KEY_VIDEO_HIGH_FRAME_RATE = "video-hfr"; @@ -1753,8 +1753,8 @@ public class Camera { public static final String ANTIBANDING_50HZ = "50hz"; public static final String ANTIBANDING_60HZ = "60hz"; public static final String ANTIBANDING_OFF = "off"; - //Values for ISO settings + //Values for ISO settings /** @hide */ public static final String ISO_AUTO = "auto"; /** @hide */ @@ -3787,7 +3787,7 @@ public class Camera { * @hide * Gets the supported ISO values. * - * @return a List of FLASH_MODE_XXX string constants. null if flash mode + * @return a list of ISO_XXX string constants. null if ISO * setting is not supported. */ public List<String> getSupportedIsoValues() { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 81ccf66..157acea 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1912,6 +1912,13 @@ public final class Settings { public static final String TTY_MODE = "tty_mode"; /** + * Whether noise suppression is enabled. The value is + * boolean (1 or 0). + * @hide + */ + public static final String NOISE_SUPPRESSION = "noise_suppression"; + + /** * Whether the sounds effects (key clicks, lid open ...) are enabled. The value is * boolean (1 or 0). */ @@ -1938,13 +1945,6 @@ public final class Settings { public static final String NOTIFICATION_LIGHT_PULSE = "notification_light_pulse"; /** - * Whether the battery LED should repeatedly flash when the battery is low - * on charge. The value is boolean (1 or 0). - * @hide - */ - public static final String BATTERY_LIGHT_PULSE = "battery_light_pulse"; - - /** * What color to use for the notification LED by default * @hide */ @@ -2010,6 +2010,38 @@ public final class Settings { */ public static final String NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES = "notification_light_pulse_custom_values"; + /** + * Whether the battery light should be enabled (if hardware supports it) + * The value is boolean (1 or 0). + * @hide + */ + public static final String BATTERY_LIGHT_ENABLED = "battery_light_enabled"; + + /** + * Whether the battery LED should repeatedly flash when the battery is low + * on charge. The value is boolean (1 or 0). + * @hide + */ + public static final String BATTERY_LIGHT_PULSE = "battery_light_pulse"; + + /** + * What color to use for the battery LED while charging - low + * @hide + */ + public static final String BATTERY_LIGHT_LOW_COLOR = "battery_light_low_color"; + + /** + * What color to use for the battery LED while charging - medium + * @hide + */ + public static final String BATTERY_LIGHT_MEDIUM_COLOR = "battery_light_medium_color"; + + /** + * What color to use for the battery LED while charging - full + * @hide + */ + public static final String BATTERY_LIGHT_FULL_COLOR = "battery_light_full_color"; + /** Sprint MWI Quirk: Show message wait indicator notifications * @hide */ @@ -2593,6 +2625,7 @@ public final class Settings { CALL_AUTO_RETRY, HEARING_AID, TTY_MODE, + NOISE_SUPPRESSION, SOUND_EFFECTS_ENABLED, HAPTIC_FEEDBACK_ENABLED, POWER_SOUNDS_ENABLED, diff --git a/core/java/android/text/method/QwertyKeyListener.java b/core/java/android/text/method/QwertyKeyListener.java index 192257b..97ee48a 100644 --- a/core/java/android/text/method/QwertyKeyListener.java +++ b/core/java/android/text/method/QwertyKeyListener.java @@ -129,6 +129,12 @@ public class QwertyKeyListener extends BaseKeyListener { return true; } + if (i == KeyCharacterMap.DOT_WWW_INPUT || i == KeyCharacterMap.DOT_COM_INPUT) { + content.replace(selStart, selEnd, selStart == 0 ? "www." : ".com"); + adjustMetaAfterKeypress(content); + return true; + } + if (i == KeyCharacterMap.HEX_INPUT) { int start; diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java index 575af3b..4e4116d 100644 --- a/core/java/android/view/KeyCharacterMap.java +++ b/core/java/android/view/KeyCharacterMap.java @@ -120,6 +120,18 @@ public class KeyCharacterMap { public static final char PICKER_DIALOG_INPUT = '\uEF01'; /** + * Private use character denoting a .com suffix + * @hide + */ + public static final char DOT_COM_INPUT = '\uEF03'; + + /** + * Private use character denoting a www. prefix + * @hide + */ + public static final char DOT_WWW_INPUT = '\uEF04'; + + /** * Modifier keys may be chorded with character keys. * * @see {#link #getModifierBehavior()} for more details. diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 458eb85..0d15d66 100755 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -592,15 +592,53 @@ public class KeyEvent extends InputEvent implements Parcelable { * Used to launch a calculator application. */ public static final int KEYCODE_CALCULATOR = 210; + /** Please note all remaining keycodes need to be + * hidden from the api */ + + /** @hide */ public static final int KEYCODE_TOGGLE_WIFI = 211; + /** @hide */ public static final int KEYCODE_TOGGLE_BT = 212; + /** @hide */ public static final int KEYCODE_TOGGLE_TOUCHPAD = 213; + /** @hide */ public static final int KEYCODE_BRIGHTNESS_DOWN = 214; + /** @hide */ public static final int KEYCODE_BRIGHTNESS_UP = 215; + /** @hide */ public static final int KEYCODE_BRIGHTNESS_AUTO = 216; + /** @hide */ public static final int KEYCODE_SCREENSHOT = 217; + /** @hide */ + /** FUNC_1 through USER5 to support keypad mapping */ + /** @hide */ + public static final int KEYCODE_FUNC_1 = 218; + /** @hide */ + public static final int KEYCODE_FUNC_2 = 219; + /** @hide */ + public static final int KEYCODE_FUNC_3 = 220; + /** @hide */ + public static final int KEYCODE_FUNC_4 = 221; + /** @hide */ + public static final int KEYCODE_FUNC_5 = 222; + /** @hide */ + public static final int KEYCODE_FUNC_6 = 223; + /** @hide */ + public static final int KEYCODE_FUNC_7 = 224; + /** @hide */ + public static final int KEYCODE_FUNC_8 = 225; + /** @hide */ + public static final int KEYCODE_USER1 = 226; + /** @hide */ + public static final int KEYCODE_USER2 = 227; + /** @hide */ + public static final int KEYCODE_USER3 = 228; + /** @hide */ + public static final int KEYCODE_USER4 = 229; + /** @hide */ + public static final int KEYCODE_USER5 = 230; - private static final int LAST_KEYCODE = KEYCODE_SCREENSHOT; + private static final int LAST_KEYCODE = KEYCODE_USER5; // NOTE: If you add a new keycode here you must also add it to: // isSystem() @@ -833,13 +871,46 @@ public class KeyEvent extends InputEvent implements Parcelable { names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR"); names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC"); names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR"); + /** @hide */ names.append(KEYCODE_TOGGLE_WIFI, "KEYCODE_TOGGLE_WIFI"); + /** @hide */ names.append(KEYCODE_TOGGLE_BT, "KEYCODE_TOGGLE_BT"); + /** @hide */ names.append(KEYCODE_TOGGLE_TOUCHPAD, "KEYCODE_TOGGLE_TOUCHPAD"); + /** @hide */ names.append(KEYCODE_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN"); + /** @hide */ names.append(KEYCODE_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP"); + /** @hide */ names.append(KEYCODE_BRIGHTNESS_AUTO, "KEYCODE_BRIGHTNESS_AUTO"); + /** @hide */ names.append(KEYCODE_SCREENSHOT, "KEYCODE_SCREENSHOT"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_1"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_2"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_3"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_4"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_5"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_6"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_7"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_FUNC_8"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_USER1"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_USER2"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_USER3"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_USER4"); + /** @hide */ + names.append(KEYCODE_SCREENSHOT, "KEYCODE_USER5"); }; // Symbolic names of all metakeys in bit order from least significant to most significant. diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 320aac9..49162ea 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1504,6 +1504,19 @@ <enum name="KEYCODE_BRIGHTNESS_UP" value="215" /> <enum name="KEYCODE_BRIGHTNESS_AUTO" value="216" /> <enum name="KEYCODE_SCREENSHOT" value="217" /> + <enum name="KEYCODE_FUNC_1" value="218" /> + <enum name="KEYCODE_FUNC_2" value="219" /> + <enum name="KEYCODE_FUNC_3" value="220" /> + <enum name="KEYCODE_FUNC_4" value="221" /> + <enum name="KEYCODE_FUNC_5" value="222" /> + <enum name="KEYCODE_FUNC_6" value="223" /> + <enum name="KEYCODE_FUNC_7" value="224" /> + <enum name="KEYCODE_FUNC_8" value="225" /> + <enum name="KEYCODE_USER1" value="226" /> + <enum name="KEYCODE_USER2" value="227" /> + <enum name="KEYCODE_USER3" value="228" /> + <enum name="KEYCODE_USER4" value="229" /> + <enum name="KEYCODE_USER5" value="230" /> </attr> <!-- ***************************************************************** --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4185659..c656bec 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -453,6 +453,9 @@ <!-- Is the battery LED intrusive? Used to decide if there should be a disable option --> <bool name="config_intrusiveBatteryLed">false</bool> + <!-- Does the battery LED support multiple colors? Used to decide if the user can change the colors --> + <bool name="config_multiColorBatteryLed">false</bool> + <!-- Default value for LED off time when the battery is low on charge in miliseconds --> <integer name="config_notificationsBatteryLedOff">2875</integer> @@ -832,4 +835,11 @@ kill the foreground app. --> <integer name="config_backKillTimeout">2000</integer> + + <!-- Device has a h/w rotation lock switch --> + <bool name="config_hasRotationLockSwitch">false</bool> + + <!--Boolean to enable stk functionality on Samsung phones--> + <bool name="config_samsung_stk">false</bool> + </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 087aeb3..4ab4d3f 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1665,6 +1665,10 @@ <item>Jabber</item> </string-array> + <!-- Hardware Rotation lock string --> + <string name="toast_rotation_unlocked">Display Rotation Unlocked</string> + <string name="toast_rotation_locked">Display Rotation Locked</string> + <!-- Custom phone number type --> <string name="phoneTypeCustom">Custom</string> <!-- Home phone number type --> diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h index 7d92506..7cc3d4e 100644 --- a/include/camera/CameraParameters.h +++ b/include/camera/CameraParameters.h @@ -580,8 +580,6 @@ public: static const char KEY_FULL_VIDEO_SNAP_SUPPORTED[]; #ifdef QCOM_HARDWARE - static const char KEY_ISO_MODE[]; - static const char KEY_SUPPORTED_ISO_MODES[]; static const char KEY_LENSSHADE[] ; static const char KEY_SUPPORTED_LENSSHADE_MODES[] ; @@ -593,6 +591,10 @@ public: static const char KEY_GPS_ALTITUDE_REF[]; static const char KEY_GPS_STATUS[]; static const char KEY_EXIF_DATETIME[]; +#ifndef SAMSUNG_CAMERA_HARDWARE + static const char KEY_ISO_MODE[]; + static const char KEY_SUPPORTED_ISO_MODES[]; +#endif #endif // The state of the video stabilization. If set to true, both the @@ -656,9 +658,11 @@ public: #endif #ifdef SAMSUNG_CAMERA_HARDWARE - static const char KEY_METERING[]; - static const char KEY_WDR[]; - static const char KEY_ANTI_SHAKE_MODE[]; + static const char KEY_METERING[]; + static const char KEY_WDR[]; + static const char KEY_ANTI_SHAKE_MODE[]; + static const char KEY_ISO_MODE[]; + static const char KEY_SUPPORTED_ISO_MODES[]; #endif // Values for white balance settings. diff --git a/include/ui/KeycodeLabels.h b/include/ui/KeycodeLabels.h index a443232..dde50f7 100755 --- a/include/ui/KeycodeLabels.h +++ b/include/ui/KeycodeLabels.h @@ -242,6 +242,19 @@ static const KeycodeLabel KEYCODES[] = { { "BRIGHTNESS_UP", 215 }, { "BRIGHTNESS_AUTO", 216 }, { "SCREENSHOT", 217 }, + { "FUNC_1", 218 }, + { "FUNC_2", 219 }, + { "FUNC_3", 220 }, + { "FUNC_4", 221 }, + { "FUNC_5", 222 }, + { "FUNC_6", 223 }, + { "FUNC_7", 224 }, + { "FUNC_8", 225 }, + { "USER1", 226 }, + { "USER2", 227 }, + { "USER3", 228 }, + { "USER4", 229 }, + { "USER5", 230 }, // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/libs/camera/CameraParameters.cpp b/libs/camera/CameraParameters.cpp index 94c7481..6ed7a25 100644 --- a/libs/camera/CameraParameters.cpp +++ b/libs/camera/CameraParameters.cpp @@ -119,8 +119,6 @@ const char CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED[] = "smooth-zoom-supporte const char CameraParameters::KEY_FOCUS_DISTANCES[] = "focus-distances"; const char CameraParameters::KEY_VIDEO_FRAME_FORMAT[] = "video-frame-format"; #ifdef QCOM_HARDWARE -const char CameraParameters::KEY_ISO_MODE[] = "iso"; -const char CameraParameters::KEY_SUPPORTED_ISO_MODES[] = "iso-values"; const char CameraParameters::KEY_LENSSHADE[] = "lensshade"; const char CameraParameters::KEY_SUPPORTED_LENSSHADE_MODES[] = "lensshade-values"; const char CameraParameters::KEY_AUTO_EXPOSURE[] = "auto-exposure"; @@ -139,11 +137,17 @@ const char CameraParameters::KEY_REDEYE_REDUCTION[] = "redeye-reduction"; const char CameraParameters::KEY_SUPPORTED_REDEYE_REDUCTION[] = "redeye-reduction-values"; const char CameraParameters::KEY_HIGH_DYNAMIC_RANGE_IMAGING[] = "hdr"; const char CameraParameters::KEY_SUPPORTED_HDR_IMAGING_MODES[] = "hdr-values"; +#ifndef SAMSUNG_CAMERA_HARDWARE +const char CameraParameters::KEY_ISO_MODE[] = "iso"; +const char CameraParameters::KEY_SUPPORTED_ISO_MODES[] = "iso-values"; +#endif #endif #ifdef SAMSUNG_CAMERA_HARDWARE const char CameraParameters::KEY_METERING[] = "metering"; const char CameraParameters::KEY_WDR[] = "wdr"; const char CameraParameters::KEY_ANTI_SHAKE_MODE[] = "anti-shake"; +const char CameraParameters::KEY_ISO_MODE[] = "iso"; +const char CameraParameters::KEY_SUPPORTED_ISO_MODES[] = "iso-values"; #endif const char CameraParameters::KEY_VIDEO_SIZE[] = "video-size"; const char CameraParameters::KEY_SUPPORTED_VIDEO_SIZES[] = "video-size-values"; diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index e38b479..94d3fab 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -221,6 +221,7 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); Caches::getInstance().fboCache.put(fbo); + layer->setFbo(0); layer->deleteTexture(); delete layer; @@ -307,6 +308,7 @@ void LayerRenderer::destroyLayer(Layer* layer) { if (layer->getFbo()) { Caches::getInstance().fboCache.put(layer->getFbo()); + layer->setFbo(0); } if (!Caches::getInstance().layerCache.put(layer)) { diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index dd377be..9dda80e 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -228,9 +228,11 @@ public class MediaRecorder /** @hide H.264/AAC data encapsulated in MPEG2/TS */ public static final int OUTPUT_FORMAT_MPEG2TS = 8; - /** QCP file format */ + /** QCP file format + * @hide */ public static final int QCP = 9; - /** 3GPP2 media file format*/ + /** 3GPP2 media file format + * @hide */ public static final int THREE_GPP2 = 10; }; @@ -250,13 +252,17 @@ public class MediaRecorder public static final int AMR_WB = 2; /** AAC audio codec */ public static final int AAC = 3; - /** enhanced AAC audio codec */ + /** enhanced AAC audio codec + * @hide */ public static final int AAC_PLUS = 4; - /** enhanced AAC plus audio codec */ + /** enhanced AAC plus audio codec + * @hide */ public static final int EAAC_PLUS = 5; - /** EVRC audio codec */ + /** EVRC audio codec + * @hide */ public static final int EVRC = 6; - /** QCELP audio codec */ + /** QCELP audio codec + * @hide */ public static final int QCELP =7; } @@ -669,6 +675,8 @@ public class MediaRecorder * * @throws IllegalStateException if it is called before * prepare(). + * + * @hide */ public native void native_start() throws IllegalStateException; @@ -683,6 +691,8 @@ public class MediaRecorder * the output file is not properly constructed when this happens. * * @throws IllegalStateException if it is called before start() + * + * @hide */ public native void native_stop() throws IllegalStateException; diff --git a/native/include/android/keycodes.h b/native/include/android/keycodes.h index f9c808d..44611e0 100644 --- a/native/include/android/keycodes.h +++ b/native/include/android/keycodes.h @@ -261,6 +261,19 @@ enum { AKEYCODE_BRIGHTNESS_UP = 215, AKEYCODE_BRIGHTNESS_AUTO = 216, AKEYCODE_SCREENSHOT = 217, + AKEYCODE_FUNC_1 = 218, + AKEYCODE_FUNC_2 = 219, + AKEYCODE_FUNC_3 = 220, + AKEYCODE_FUNC_4 = 221, + AKEYCODE_FUNC_5 = 222, + AKEYCODE_FUNC_6 = 223, + AKEYCODE_FUNC_7 = 224, + AKEYCODE_FUNC_8 = 225, + AKEYCODE_USER1 = 226, + AKEYCODE_USER2 = 227, + AKEYCODE_USER3 = 228, + AKEYCODE_USER4 = 229, + AKEYCODE_USER5 = 230, // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 630dfa5..e0753d0 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -1355,6 +1355,9 @@ public class DatabaseHelper extends SQLiteOpenHelper { // Set default tty mode loadSetting(stmt, Settings.System.TTY_MODE, 0); + + // Set default noise suppression value + loadSetting(stmt, Settings.System.NOISE_SUPPRESSION, 0); loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON, R.bool.def_airplane_mode_on); diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index 652166d..0dad55a 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -265,7 +265,7 @@ void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) { // Reset the key repeat timer whenever we disallow key events, even if the next event // is not a key. This is to ensure that we abort a key repeat if the device is just coming // out of sleep. - if (!mPolicy->isKeyRepeatEnabled()) { + if (!mPolicy->isKeyRepeatEnabled() || !mDispatchEnabled) { resetKeyRepeatLocked(); } diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java index c9e533a..3312a9e 100644 --- a/services/java/com/android/server/BatteryService.java +++ b/services/java/com/android/server/BatteryService.java @@ -16,21 +16,20 @@ package com.android.server; -import com.android.internal.app.IBatteryStats; -import com.android.server.am.BatteryStatsService; - import android.app.ActivityManagerNative; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.database.ContentObserver; +import android.graphics.Color; import android.os.BatteryManager; import android.os.Binder; +import android.os.DropBoxManager; import android.os.FileUtils; import android.os.Handler; import android.os.IBinder; -import android.os.DropBoxManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -39,14 +38,15 @@ import android.provider.Settings; import android.util.EventLog; import android.util.Slog; +import com.android.internal.app.IBatteryStats; +import com.android.server.am.BatteryStatsService; + import java.io.File; import java.io.FileDescriptor; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.util.Arrays; - +import java.util.Calendar; /** * <p>BatteryService monitors the charging status, and charge level of the device @@ -130,10 +130,21 @@ class BatteryService extends Binder { private int mDischargeStartLevel; private Led mLed; + private boolean mLightEnabled; private boolean mLedPulseEnabled; + private int mBatteryLowARGB; + private int mBatteryMediumARGB; + private int mBatteryFullARGB; + private boolean mMultiColorLed; private boolean mSentLowBatteryBroadcast = false; + // Quiet hours support + private boolean mQuietHoursEnabled = false; + private int mQuietHoursStart = 0; + private int mQuietHoursEnd = 0; + private boolean mQuietHoursDim = true; + public BatteryService(Context context, LightsService lights) { mContext = context; mLed = new Led(context, lights); @@ -571,9 +582,6 @@ class BatteryService extends Binder { private LightsService mLightsService; private LightsService.Light mBatteryLight; - private int mBatteryLowARGB; - private int mBatteryMediumARGB; - private int mBatteryFullARGB; private int mBatteryLedOn; private int mBatteryLedOff; @@ -582,15 +590,14 @@ class BatteryService extends Binder { private boolean mBatteryFull; Led(Context context, LightsService lights) { + mLightsService = lights; mBatteryLight = lights.getLight(LightsService.LIGHT_ID_BATTERY); - mBatteryLowARGB = mContext.getResources().getInteger( - com.android.internal.R.integer.config_notificationsBatteryLowARGB); - mBatteryMediumARGB = mContext.getResources().getInteger( - com.android.internal.R.integer.config_notificationsBatteryMediumARGB); - mBatteryFullARGB = mContext.getResources().getInteger( - com.android.internal.R.integer.config_notificationsBatteryFullARGB); + // Does the Device support changing battery LED colors? + mMultiColorLed = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_multiColorBatteryLed); + mBatteryLedOn = mContext.getResources().getInteger( com.android.internal.R.integer.config_notificationsBatteryLedOn); mBatteryLedOff = mContext.getResources().getInteger( @@ -603,12 +610,27 @@ class BatteryService extends Binder { void updateLightsLocked() { final int level = mBatteryLevel; final int status = mBatteryStatus; - if (level < mLowBatteryWarningLevel) { + + if (!mLightEnabled) { + // No lights if explicitly disabled + mBatteryLight.turnOff(); + } else if (inQuietHours() && mQuietHoursDim) { + if (mLedPulseEnabled && level < mLowBatteryWarningLevel && + status != BatteryManager.BATTERY_STATUS_CHARGING) { + // The battery is low, the device is not charging and the low battery pulse + // is enabled - ignore Quiet Hours + mBatteryLight.setFlashing(mBatteryLowARGB, LightsService.LIGHT_FLASH_TIMED, + mBatteryLedOn, mBatteryLedOff); + } else { + // No lights if in Quiet Hours and battery not low + mBatteryLight.turnOff(); + } + } else if (level < mLowBatteryWarningLevel) { if (status == BatteryManager.BATTERY_STATUS_CHARGING) { - // Solid red when battery is charging + // Battery is charging and low mBatteryLight.setColor(mBatteryLowARGB); } else if (mLedPulseEnabled) { - // Flash red when battery is low and not charging + // Battery is low and not charging mBatteryLight.setFlashing(mBatteryLowARGB, LightsService.LIGHT_FLASH_TIMED, mBatteryLedOn, mBatteryLedOff); } else { @@ -616,16 +638,16 @@ class BatteryService extends Binder { mBatteryLight.turnOff(); } } else if (status == BatteryManager.BATTERY_STATUS_CHARGING - || status == BatteryManager.BATTERY_STATUS_FULL) { + || status == BatteryManager.BATTERY_STATUS_FULL) { if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) { - // Solid green when full or charging and nearly full + // Battery is full or charging and nearly full mBatteryLight.setColor(mBatteryFullARGB); } else { - // Solid orange when charging and halfway full + // Battery is charging and halfway full mBatteryLight.setColor(mBatteryMediumARGB); } } else { - // No lights if not charging and not low + //No lights if not charging and not low mBatteryLight.turnOff(); } } @@ -638,8 +660,36 @@ class BatteryService extends Binder { void observe() { ContentResolver resolver = mContext.getContentResolver(); + + // Battery light enabled + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.BATTERY_LIGHT_ENABLED), false, this); + + // Low battery pulse resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.BATTERY_LIGHT_PULSE), false, this); + + // Light colors + if (mMultiColorLed) { + // Register observer if we have a multi color led + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.BATTERY_LIGHT_LOW_COLOR), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.BATTERY_LIGHT_MEDIUM_COLOR), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.BATTERY_LIGHT_FULL_COLOR), false, this); + } + + // Quiet Hours + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.QUIET_HOURS_ENABLED), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.QUIET_HOURS_START), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.QUIET_HOURS_END), false, this); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.QUIET_HOURS_DIM), false, this); + update(); } @@ -649,13 +699,54 @@ class BatteryService extends Binder { public void update() { ContentResolver resolver = mContext.getContentResolver(); - boolean pulseEnabled = Settings.System.getInt(resolver, + Resources res = mContext.getResources(); + + // Battery light enabled + mLightEnabled = Settings.System.getInt(resolver, + Settings.System.BATTERY_LIGHT_ENABLED, 1) != 0; + + // Low battery pulse + mLedPulseEnabled = Settings.System.getInt(resolver, Settings.System.BATTERY_LIGHT_PULSE, 1) != 0; - if (mLedPulseEnabled != pulseEnabled) { - mLedPulseEnabled = pulseEnabled; - updateLedPulse(); + + // Light colors + mBatteryLowARGB = Settings.System.getInt(resolver, + Settings.System.BATTERY_LIGHT_LOW_COLOR, + res.getInteger(com.android.internal.R.integer.config_notificationsBatteryLowARGB)); + mBatteryMediumARGB = Settings.System.getInt(resolver, + Settings.System.BATTERY_LIGHT_MEDIUM_COLOR, + res.getInteger(com.android.internal.R.integer.config_notificationsBatteryMediumARGB)); + mBatteryFullARGB = Settings.System.getInt(resolver, + Settings.System.BATTERY_LIGHT_FULL_COLOR, + res.getInteger(com.android.internal.R.integer.config_notificationsBatteryFullARGB)); + + // Quiet Hours + mQuietHoursEnabled = Settings.System.getInt(resolver, + Settings.System.QUIET_HOURS_ENABLED, 0) != 0; + mQuietHoursStart = Settings.System.getInt(resolver, + Settings.System.QUIET_HOURS_START, 0); + mQuietHoursEnd = Settings.System.getInt(resolver, + Settings.System.QUIET_HOURS_END, 0); + mQuietHoursDim = Settings.System.getInt(resolver, + Settings.System.QUIET_HOURS_DIM, 0) != 0; + + updateLedPulse(); + } + } + + private boolean inQuietHours() { + if (mQuietHoursEnabled && (mQuietHoursStart != mQuietHoursEnd)) { + // Get the date in "quiet hours" format. + Calendar calendar = Calendar.getInstance(); + int minutes = calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE); + if (mQuietHoursEnd < mQuietHoursStart) { + // Starts at night, ends in the morning. + return (minutes > mQuietHoursStart) || (minutes < mQuietHoursEnd); + } else { + return (minutes > mQuietHoursStart) && (minutes < mQuietHoursEnd); } } + return false; } -} +} diff --git a/services/java/com/android/server/RotationSwitchObserver.java b/services/java/com/android/server/RotationSwitchObserver.java new file mode 100644 index 0000000..a191433 --- /dev/null +++ b/services/java/com/android/server/RotationSwitchObserver.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.android.server; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Handler; +import android.os.Message; +import android.os.SystemClock; +import android.os.UEventObserver; +import android.provider.Settings; +import android.util.Log; +import android.util.Slog; + +import android.widget.Toast; +import android.view.IWindowManager; +import android.os.ServiceManager; +import android.os.RemoteException; +import android.os.AsyncTask; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * <p>RotationLockObserver monitors for rotation lock switch state + */ +class RotationSwitchObserver extends UEventObserver { + private static final String TAG = RotationSwitchObserver.class + .getSimpleName(); + private static final boolean LOG = true; + + private static final String LOCK_UEVENT_MATCH = + "DEVPATH=/devices/virtual/switch/rotationlock"; + private static final String LOCK_STATE_PATH = + "/sys/class/switch/rotationlock/state"; + + private static final int MSG_LOCK_STATE = 0; + + private int mLockState; + private int mPreviousLockState; + + private boolean mSystemReady; + + private final Context mContext; + + private boolean mAutoRotation; + + public RotationSwitchObserver(Context context) { + mContext = context; + init(); // set initial status + + startObserving(LOCK_UEVENT_MATCH); + } + + @Override + public void onUEvent(UEventObserver.UEvent event) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Slog.v(TAG, "Switch UEVENT: " + event.toString()); + } + + synchronized (this) { + try { + int newState = Integer.parseInt(event.get("SWITCH_STATE")); + if (newState != mLockState) { + mPreviousLockState = mLockState; + mLockState = newState; + if (mSystemReady) { + update(); + } + } + } catch (NumberFormatException e) { + Slog.e(TAG, "Could not parse switch state from event " + + event); + } + } + } + + private final void init() { + char[] buffer = new char[1024]; + + try { + FileReader file = new FileReader(LOCK_STATE_PATH); + int len = file.read(buffer, 0, 1024); + file.close(); + mPreviousLockState = mLockState = + Integer.valueOf((new String(buffer, 0, len)).trim()); + } catch (FileNotFoundException e) { + Slog.w(TAG, "This kernel does not have rotation switch support"); + } catch (NumberFormatException e) { + Slog.e(TAG, "" , e); + } catch (IOException e) { + Slog.e(TAG, "" , e); + } + } + + void systemReady() { + synchronized (this) { + mSystemReady = true; + } + } + + private final void update() { + mHandler.sendEmptyMessage(MSG_LOCK_STATE); + } + + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_LOCK_STATE: + synchronized (this) { + boolean autoRotate = mLockState == 0; + int toastId = autoRotate + ? com.android.internal.R.string.toast_rotation_unlocked + : com.android.internal.R.string.toast_rotation_locked; + + setAutoRotation(autoRotate); + + Toast.makeText(mContext, mContext.getString(toastId), + Toast.LENGTH_SHORT).show(); + break; + } + } + } + }; + + private void setAutoRotation(final boolean autorotate) { + mAutoRotation = autorotate; + AsyncTask.execute(new Runnable() { + public void run() { + try { + IWindowManager wm = IWindowManager.Stub.asInterface( + ServiceManager + .getService(Context.WINDOW_SERVICE)); + if (autorotate) { + wm.thawRotation(); + } else { + wm.freezeRotation(-1); + } + } catch (RemoteException exc) { + Log.w(TAG, "Unable to save auto-rotate setting"); + } + } + }); + } +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 17a4b5d..c13a3e2 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -144,6 +144,7 @@ class ServerThread extends Thread { BluetoothService bluetooth = null; BluetoothA2dpService bluetoothA2dp = null; DockObserver dock = null; + RotationSwitchObserver rotateSwitch = null; UsbService usb = null; UiModeManagerService uiMode = null; RecognitionManagerService recognition = null; @@ -282,6 +283,9 @@ class ServerThread extends Thread { Slog.e("System", "************ Failure starting core service", e); } + boolean hasRotationLock = context.getResources().getBoolean(com.android + .internal.R.bool.config_hasRotationLockSwitch); + DevicePolicyManagerService devicePolicy = null; StatusBarManagerService statusBar = null; InputMethodManagerService imm = null; @@ -531,6 +535,16 @@ class ServerThread extends Thread { } try { + if (hasRotationLock) { + Slog.i(TAG, "Rotation Switch Observer"); + // Listen for switch changes + rotateSwitch = new RotationSwitchObserver(context); + } + } catch (Throwable e) { + reportWtf("starting RotationSwitchObserver", e); + } + + try { Slog.i(TAG, "Wired Accessory Observer"); // Listen for wired headset changes new WiredAccessoryObserver(context); @@ -696,6 +710,7 @@ class ServerThread extends Thread { final NetworkPolicyManagerService networkPolicyF = networkPolicy; final ConnectivityService connectivityF = connectivity; final DockObserver dockF = dock; + final RotationSwitchObserver rotateSwitchF = rotateSwitch; final UsbService usbF = usb; final ThrottleService throttleF = throttle; final UiModeManagerService uiModeF = uiMode; @@ -750,6 +765,11 @@ class ServerThread extends Thread { reportWtf("making Dock Service ready", e); } try { + if (rotateSwitchF != null) rotateSwitchF.systemReady(); + } catch (Throwable e) { + reportWtf("making Rotation Switch Service ready", e); + } + try { if (usbF != null) usbF.systemReady(); } catch (Throwable e) { reportWtf("making USB Service ready", e); diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index 35503d3..4e4f851 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -62,6 +62,7 @@ class ScreenRotationAnimation { public ScreenRotationAnimation(Context context, SurfaceSession session, boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) { + boolean isTegra = android.os.SystemProperties.get("ro.board.platform","").equals("tegra"); mContext = context; // Screenshot does NOT include rotation! @@ -99,7 +100,7 @@ class ScreenRotationAnimation { try { try { mSurface = new Surface(session, 0, "FreezeSurface", - -1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN); + -1, mWidth, mHeight, PixelFormat.OPAQUE, isTegra ? 0 : (Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN)); if (mSurface == null || !mSurface.isValid()) { // Screenshot failed, punt. mSurface = null; @@ -116,6 +117,35 @@ class ScreenRotationAnimation { " FREEZE " + mSurface + ": CREATE"); setRotation(originalRotation); + + if (isTegra) { + Rect rect = new Rect(0, 0, mWidth, mHeight); + Canvas canvas = null; + + try { + canvas = mSurface.lockCanvas(rect); + } catch (IllegalArgumentException e) { + Slog.w(TAG, "Unable to lock surface", e); + } catch (Surface.OutOfResourcesException e) { + Slog.w(TAG, "Unable to lock surface", e); + } + + Bitmap screenshot = Surface.screenshot(0, 0); + if (canvas == null || screenshot == null) { + Slog.w(TAG, "Null surface canvas"); + mSurface.destroy(); + mSurface = null; + return; + } + + Paint paint = new Paint(0); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); + + canvas.drawBitmap(screenshot, 0, 0, paint); + mSurface.unlockCanvasAndPost(canvas); + + } + } finally { if (!inTransaction) { Surface.closeTransaction(); diff --git a/telephony/java/com/android/internal/telephony/CommandsInterface.java b/telephony/java/com/android/internal/telephony/CommandsInterface.java index abcee78..5b12e43 100644 --- a/telephony/java/com/android/internal/telephony/CommandsInterface.java +++ b/telephony/java/com/android/internal/telephony/CommandsInterface.java @@ -1652,4 +1652,11 @@ public interface CommandsInterface { * CM-specific: Ask the RIL about the presence of back-compat flags */ public boolean needsOldRilFeature(String feature); + /** + * @hide + * samsung stk service implementation - set up registrant for sending + * sms send result from modem(RIL) to catService + */ + void setOnCatSendSmsResult(Handler h, int what, Object obj); + void unSetOnCatSendSmsResult(Handler h); } diff --git a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java index 9763265..d0da285 100644 --- a/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java +++ b/telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java @@ -212,6 +212,19 @@ public abstract class IccSmsInterfaceManager extends ISms.Stub { return data; } + /** + * stk send sms Samsung way + * @param smsc + * @param pdu + * @param sentIntent + * @param deliveryIntent + */ + public void sendRawPduSat(byte[] smsc, byte[] pdu, PendingIntent sentIntent, + PendingIntent deliveryIntent) { + mPhone.getContext(); + mDispatcher.sendRawPdu(smsc, pdu, sentIntent, deliveryIntent); + } + protected abstract void log(String msg); } diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java index b8e7029..d4015ae 100644 --- a/telephony/java/com/android/internal/telephony/RIL.java +++ b/telephony/java/com/android/internal/telephony/RIL.java @@ -41,6 +41,7 @@ import android.os.Message; import android.os.Parcel; import android.os.PowerManager; import android.os.SystemProperties; +import android.os.Registrant; import android.os.PowerManager.WakeLock; import android.telephony.NeighboringCellInfo; import android.telephony.PhoneNumberUtils; @@ -267,6 +268,26 @@ public class RIL extends BaseCommands implements CommandsInterface { } }; + protected Registrant mCatSendSmsResultRegistrant; + /** + * samsung stk service implementation - set up registrant for sending + * sms send result from modem(RIL) to catService + * @param h + * @param what + * @param obj + */ + public void setOnCatSendSmsResult(Handler h, int what, Object obj) { + mCatSendSmsResultRegistrant = new Registrant(h, what, obj); + } + + /** + * + * @param h + */ + public void unSetOnCatSendSmsResult(Handler h) { + mCatSendSmsResultRegistrant.clear(); + } + class RILSender extends Handler implements Runnable { public RILSender(Looper looper) { super(looper); @@ -2467,6 +2488,8 @@ public class RIL extends BaseCommands implements CommandsInterface { case RIL_UNSOL_CDMA_PRL_CHANGED: ret = responseInts(p); break; case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break; + //samsung stk service implementation + case RIL_UNSOL_STK_SEND_SMS_RESULT: ret = responseInts(p); break; default: throw new RuntimeException("Unrecognized unsol response: " + response); @@ -2812,6 +2835,19 @@ public class RIL extends BaseCommands implements CommandsInterface { notifyRegistrantsRilConnectionChanged(((int[])ret)[0]); break; } + + //samsung stk service implementation + case RIL_UNSOL_STK_SEND_SMS_RESULT: + if (Resources.getSystem(). + getBoolean(com.android.internal.R.bool.config_samsung_stk)) { + if (RILJ_LOGD) unsljLogRet(response, ret); + + if (mCatSendSmsResultRegistrant != null) { + mCatSendSmsResultRegistrant.notifyRegistrant( + new AsyncResult (null, ret, null)); + } + } + break; } } @@ -3608,6 +3644,7 @@ public class RIL extends BaseCommands implements CommandsInterface { case RIL_UNSOL_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED"; case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE"; case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED"; + case RIL_UNSOL_STK_SEND_SMS_RESULT: return "RIL_UNSOL_STK_SEND_SMS_RESULT"; default: return "<unknown response: "+request+">"; } } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 1bf2064..36c616a 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -300,4 +300,5 @@ cat include/telephony/ril.h | \ int RIL_UNSOL_CDMA_PRL_CHANGED = 1032; int RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE = 1033; int RIL_UNSOL_RIL_CONNECTED = 1034; + int RIL_UNSOL_STK_SEND_SMS_RESULT = 11002; /* Samsung specific */ } diff --git a/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java b/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java new file mode 100644 index 0000000..ff5bce1 --- /dev/null +++ b/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java @@ -0,0 +1,364 @@ +/* + * Copyright (C) 2012 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +import static com.android.internal.telephony.RILConstants.*; + +import android.content.Context; +import android.os.AsyncResult; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Parcel; +import android.telephony.SmsMessage; +import android.os.SystemProperties; +import android.text.TextUtils; +import android.util.Log; + +import android.telephony.PhoneNumberUtils; +import com.android.internal.telephony.RILConstants; +import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo; +import com.android.internal.telephony.cdma.CdmaInformationRecords; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * Samsung CDMA RIL doesn't send CDMA NV in RIUM infomation format which causes the CDMA RIL stack to crash and end up not being provisioned. + * Samsung put CDMA NV in GSM format. I forced the RIL stack to process CDMA NV request as a GSM SIM in CDMA mode. + * Custom Qualcomm No SimReady RIL using the latest Uicc stack + * + * {@hide} + */ +public class SamsungCDMAQualcommRIL extends QualcommSharedRIL implements CommandsInterface { + protected IccHandler mIccHandler; + private final int RIL_INT_RADIO_OFF = 0; + private final int RIL_INT_RADIO_UNAVALIABLE = 1; + private final int RIL_INT_RADIO_ON = 2; + private final int RIL_INT_RADIO_ON_NG = 10; + private final int RIL_INT_RADIO_ON_HTC = 13; + + public SamsungCDMAQualcommRIL(Context context, int networkMode, int cdmaSubscription) { + super(context, networkMode, cdmaSubscription); + } + + @Override + protected Object + responseIccCardStatus(Parcel p) { + IccCardApplication ca; + + IccCardStatus status = new IccCardStatus(); + status.setCardState(p.readInt()); + status.setUniversalPinState(p.readInt()); + status.setGsmUmtsSubscriptionAppIndex(p.readInt()); + status.setCdmaSubscriptionAppIndex(p.readInt()); + + status.setImsSubscriptionAppIndex(p.readInt()); + + int numApplications = p.readInt(); + + // limit to maximum allowed applications + if (numApplications > IccCardStatus.CARD_MAX_APPS) { + numApplications = IccCardStatus.CARD_MAX_APPS; + } + status.setNumApplications(numApplications); + + for (int i = 0; i < numApplications; i++) { + ca = new IccCardApplication(); + ca.app_type = ca.AppTypeFromRILInt(p.readInt()); + ca.app_state = ca.AppStateFromRILInt(p.readInt()); + ca.perso_substate = ca.PersoSubstateFromRILInt(p.readInt()); + ca.aid = p.readString(); + ca.app_label = p.readString(); + ca.pin1_replaced = p.readInt(); + ca.pin1 = ca.PinStateFromRILInt(p.readInt()); + ca.pin2 = ca.PinStateFromRILInt(p.readInt()); + p.readInt(); //remaining_count_pin1 + p.readInt(); //remaining_count_puk1 + p.readInt(); //remaining_count_pin2 + p.readInt(); //remaining_count_puk2 + status.addApplication(ca); + } + int appIndex = -1; + appIndex = status.getGsmUmtsSubscriptionAppIndex(); + Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex); + + + if (numApplications > 0) { + IccCardApplication application = status.getApplication(appIndex); + mAid = application.aid; + mUSIM = application.app_type + == IccCardApplication.AppType.APPTYPE_USIM; + mSetPreferredNetworkType = mPreferredNetworkType; + + if (TextUtils.isEmpty(mAid)) + mAid = ""; + Log.d(LOG_TAG, "mAid " + mAid); + } + + return status; + } + + private void setRadioStateFromRILInt (int stateCode) { + CommandsInterface.RadioState radioState; + HandlerThread handlerThread; + Looper looper; + IccHandler iccHandler; + + switch (stateCode) { + case RIL_INT_RADIO_OFF: + radioState = CommandsInterface.RadioState.RADIO_OFF; + if (mIccHandler != null) { + mIccThread = null; + mIccHandler = null; + } + break; + case RIL_INT_RADIO_UNAVALIABLE: + radioState = CommandsInterface.RadioState.RADIO_UNAVAILABLE; + break; + case RIL_INT_RADIO_ON: + case RIL_INT_RADIO_ON_NG: + case RIL_INT_RADIO_ON_HTC: + if (mIccHandler == null) { + handlerThread = new HandlerThread("IccHandler"); + mIccThread = handlerThread; + + mIccThread.start(); + + looper = mIccThread.getLooper(); + mIccHandler = new IccHandler(this,looper); + mIccHandler.run(); + } + radioState = CommandsInterface.RadioState.SIM_NOT_READY; + + setRadioState(radioState); + break; + default: + throw new RuntimeException("Unrecognized RIL_RadioState: " + stateCode); + } + + setRadioState (radioState); + } + @Override + protected Object + responseSignalStrength(Parcel p) { + int numInts = 12; + int response[]; + + // This is a mashup of algorithms used in + // SamsungQualcommUiccRIL.java + + // Get raw data + response = new int[numInts]; + for (int i = 0 ; i < numInts ; i++) { + response[i] = p.readInt(); + } + //Workaround: use cdmaecio and evdoecio to determine signal strength and it is better than no signal bars + //TODO: find a proper fix for it + response[2] = response[3]*4; // mutiply by 4 simulate dbm so the signal bars do not jump often to full bars + response[4] = response[5]*4; + // RIL_LTE_SignalStrength + if (response[7] == 99) { + // If LTE is not enabled, clear LTE results + // 7-11 must be -1 for GSM signal strength to be used (see frameworks/base/telephony/java/android/telephony/SignalStrength.java) + response[7] = -1; + response[8] = -1; + response[9] = -1; + response[10] = -1; + response[11] = -1; + } else { + response[8] *= -1; + } + + return response; + + } + + @Override + protected Object + responseCallList(Parcel p) { + int num; + int voiceSettings; + ArrayList<DriverCall> response; + DriverCall dc; + + num = p.readInt(); + response = new ArrayList<DriverCall>(num); + + for (int i = 0 ; i < num ; i++) { + dc = new DriverCall(); + + dc.state = DriverCall.stateFromCLCC(p.readInt()); + dc.index = p.readInt(); + dc.TOA = p.readInt(); + dc.isMpty = (0 != p.readInt()); + dc.isMT = (0 != p.readInt()); + dc.als = p.readInt(); + voiceSettings = p.readInt(); + dc.isVoice = (0 == voiceSettings) ? false : true; + dc.isVoicePrivacy = (0 != p.readInt()); + //Some Samsung magic data for Videocalls + // hack taken from smdk4210ril class + voiceSettings = p.readInt(); + //printing it to cosole for later investigation + Log.d(LOG_TAG, "Samsung magic = " + voiceSettings); + dc.number = p.readString(); + int np = p.readInt(); + dc.numberPresentation = DriverCall.presentationFromCLIP(np); + dc.name = p.readString(); + dc.namePresentation = p.readInt(); + int uusInfoPresent = p.readInt(); + if (uusInfoPresent == 1) { + dc.uusInfo = new UUSInfo(); + dc.uusInfo.setType(p.readInt()); + dc.uusInfo.setDcs(p.readInt()); + byte[] userData = p.createByteArray(); + dc.uusInfo.setUserData(userData); + riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d", + dc.uusInfo.getType(), dc.uusInfo.getDcs(), + dc.uusInfo.getUserData().length)); + riljLogv("Incoming UUS : data (string)=" + + new String(dc.uusInfo.getUserData())); + riljLogv("Incoming UUS : data (hex): " + + IccUtils.bytesToHexString(dc.uusInfo.getUserData())); + } else { + riljLogv("Incoming UUS : NOT present!"); + } + + // Make sure there's a leading + on addresses with a TOA of 145 + dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); + + response.add(dc); + + if (dc.isVoicePrivacy) { + mVoicePrivacyOnRegistrants.notifyRegistrants(); + riljLog("InCall VoicePrivacy is enabled"); + } else { + mVoicePrivacyOffRegistrants.notifyRegistrants(); + riljLog("InCall VoicePrivacy is disabled"); + } + } + + Collections.sort(response); + + return response; + } + + class IccHandler extends Handler implements Runnable { + private static final int EVENT_RADIO_ON = 1; + private static final int EVENT_ICC_STATUS_CHANGED = 2; + private static final int EVENT_GET_ICC_STATUS_DONE = 3; + private static final int EVENT_RADIO_OFF_OR_UNAVAILABLE = 4; + + private RIL mRil; + private boolean mRadioOn = false; + + public IccHandler (RIL ril, Looper looper) { + super (looper); + mRil = ril; + } + + public void handleMessage (Message paramMessage) { + switch (paramMessage.what) { + case EVENT_RADIO_ON: + mRadioOn = true; + Log.d(LOG_TAG, "Radio on -> Forcing sim status update"); + sendMessage(obtainMessage(EVENT_ICC_STATUS_CHANGED)); + break; + case EVENT_GET_ICC_STATUS_DONE: + AsyncResult asyncResult = (AsyncResult) paramMessage.obj; + if (asyncResult.exception != null) { + Log.e (LOG_TAG, "IccCardStatusDone shouldn't return exceptions!", asyncResult.exception); + break; + } + IccCardStatus status = (IccCardStatus) asyncResult.result; + if (status.getNumApplications() == 0) { + if (!mRil.getRadioState().isOn()) { + break; + } + mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT); + } else { + int appIndex = -1; + appIndex = status.getGsmUmtsSubscriptionAppIndex(); + Log.d(LOG_TAG, "This is a CDMA PHONE " + appIndex); + + IccCardApplication application = status.getApplication(appIndex); + IccCardApplication.AppState app_state = application.app_state; + IccCardApplication.AppType app_type = application.app_type; + + switch (app_state) { + case APPSTATE_PIN: + case APPSTATE_PUK: + switch (app_type) { + case APPTYPE_SIM: + case APPTYPE_USIM: + mRil.setRadioState(CommandsInterface.RadioState.SIM_LOCKED_OR_ABSENT); + break; + case APPTYPE_RUIM: + mRil.setRadioState(CommandsInterface.RadioState.RUIM_LOCKED_OR_ABSENT); + break; + default: + Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type); + return; + } + break; + case APPSTATE_READY: + switch (app_type) { + case APPTYPE_SIM: + case APPTYPE_USIM: + mRil.setRadioState(CommandsInterface.RadioState.SIM_READY); + break; + case APPTYPE_RUIM: + mRil.setRadioState(CommandsInterface.RadioState.RUIM_READY); + break; + default: + Log.e(LOG_TAG, "Currently we don't handle SIMs of type: " + app_type); + return; + } + break; + default: + return; + } + } + break; + case EVENT_ICC_STATUS_CHANGED: + if (mRadioOn) { + Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus"); + mRil.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, paramMessage.obj)); + } else { + Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED while radio is not ON. Ignoring"); + } + break; + case EVENT_RADIO_OFF_OR_UNAVAILABLE: + mRadioOn = false; + // disposeCards(); // to be verified; + default: + Log.e(LOG_TAG, " Unknown Event " + paramMessage.what); + break; + } + } + + public void run () { + mRil.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null); + Message msg = obtainMessage(EVENT_RADIO_ON); + mRil.getIccCardStatus(msg); + } + } + + +} diff --git a/telephony/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java b/telephony/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java index c45ab19..2c942ea 100644 --- a/telephony/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java +++ b/telephony/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java @@ -38,6 +38,9 @@ public class SamsungQualcommUiccRIL extends QualcommSharedRIL implements Command boolean RILJ_LOGV = true; boolean RILJ_LOGD = true; + public static final int INVALID_SNR = 0x7fffffff; + private boolean mSignalbarCount = SystemProperties.getBoolean("ro.telephony.sends_barcount", false); + public SamsungQualcommUiccRIL(Context context, int networkMode, int cdmaSubscription) { super(context, networkMode, cdmaSubscription); } @@ -225,18 +228,29 @@ public class SamsungQualcommUiccRIL extends QualcommSharedRIL implements Command for (int i = 0 ; i < numInts ; i++) { response[i] = p.readInt(); } + Log.d(LOG_TAG, "responseSignalStength BEFORE: mode=" + (mSignalbarCount ? "bars" : "raw") + + " gsmDbm=" + response[0] + " gsmEcio=" + response[1] + + " lteSignalStrength=" + response[7] + " lteRsrp=" + response[8] + " lteRsrq=" + response[9] + + " lteRssnr=" + response[10] + " lteCqi=" + response[11]); // RIL_GW_SignalStrength - boolean mSignalbarCount = SystemProperties.getBoolean("telephony.sends_barcount", true); - if(mSignalbarCount) { + if (mSignalbarCount) { //Samsung sends the count of bars that should be displayed instead of //a real signal strength - response[0] = ((response[0] & 0xFF00) >> 8) * 3; //gsmDbm - if ((response[0] > 0) && (response[0] != 99)) { - response[0]--; // correct down by 1 dBm to match stock's behavior + int num_bars = (response[0] & 0xff00) >> 8; + + // Translate number of bars into something SignalStrength.java can understand + switch (num_bars) { + case 0 : response[0] = 1; break; // map to 0 bars + case 1 : response[0] = 3; break; // map to 1 bar + case 2 : response[0] = 5; break; // map to 2 bars + case 3 : response[0] = 8; break; // map to 3 bars + case 4 : response[0] = 12; break; // map to 4 bars + case 5 : response[0] = 15; break; // map to 4 bars but give an extra 10 dBm + default : response[0] &= 0xff; break; // no idea; just pass value through } } else { - response[0] = response[0] & 0xFF; //gsmDbm + response[0] &= 0xff; //gsmDbm } response[1] = -1; // gsmEcio @@ -253,15 +267,35 @@ public class SamsungQualcommUiccRIL extends QualcommSharedRIL implements Command if (response[7] == 99) { // If LTE is not enabled, clear LTE results // 7-11 must be -1 for GSM signal strength to be used (see frameworks/base/telephony/java/android/telephony/SignalStrength.java) - response[7] = -1; - response[8] = -1; - response[9] = -1; - response[10] = -1; - response[11] = -1; + response[7] = -1; // lteSignalStrength + response[8] = -1; // lteRsrp + response[9] = -1; // lteRsrq + response[10] = -1; // lteRssnr + response[11] = -1; // lteCqi + } else if (mSignalbarCount) { + int num_bars = (response[7] & 0xff00) >> 8; + response[7] &= 0xff; // remove the Samsung number of bars field + response[10] = INVALID_SNR; // mark lteRssnr invalid so it doesn't get used + + // Translate number of bars into something SignalStrength.java can understand + switch (num_bars) { + case 0 : response[8] = -1; break; // map to 0 bars + case 1 : response[8] = -116; break; // map to 1 bar + case 2 : response[8] = -115; break; // map to 2 bars + case 3 : response[8] = -105; break; // map to 3 bars + case 4 : response[8] = -95; break; // map to 4 bars + case 5 : response[8] = -85; break; // map to 4 bars but give an extra 10 dBm + default : response[8] *= -1; break; // no idea; just pass value through + } } else { + response[7] &= 0xff; // remove the Samsung number of bars field response[8] *= -1; } + Log.d(LOG_TAG, "responseSignalStength AFTER: mode=" + (mSignalbarCount ? "bars" : "raw") + + " gsmDbm=" + response[0] + " gsmEcio=" + response[1] + + " lteSignalStrength=" + response[7] + " lteRsrp=" + response[8] + " lteRsrq=" + response[9] + + " lteRssnr=" + response[10] + " lteCqi=" + response[11]); return response; } } diff --git a/telephony/java/com/android/internal/telephony/Smdk4210RIL.java b/telephony/java/com/android/internal/telephony/Smdk4210RIL.java index 106e0f8..4226a7e 100644 --- a/telephony/java/com/android/internal/telephony/Smdk4210RIL.java +++ b/telephony/java/com/android/internal/telephony/Smdk4210RIL.java @@ -30,6 +30,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; +import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.LocalSocket; import android.net.LocalSocketAddress; @@ -64,20 +65,97 @@ import java.util.Collections; public class Smdk4210RIL extends RIL implements CommandsInterface { - //SAMSUNG SMDK4210 STATES + //SAMSUNG STATES + static final int RIL_REQUEST_GET_CELL_BROADCAST_CONFIG = 10002; + + static final int RIL_REQUEST_SEND_ENCODED_USSD = 10005; + static final int RIL_REQUEST_SET_PDA_MEMORY_STATUS = 10006; + static final int RIL_REQUEST_GET_PHONEBOOK_STORAGE_INFO = 10007; + static final int RIL_REQUEST_GET_PHONEBOOK_ENTRY = 10008; + static final int RIL_REQUEST_ACCESS_PHONEBOOK_ENTRY = 10009; + static final int RIL_REQUEST_DIAL_VIDEO_CALL = 10010; + static final int RIL_REQUEST_CALL_DEFLECTION = 10011; + static final int RIL_REQUEST_READ_SMS_FROM_SIM = 10012; + static final int RIL_REQUEST_USIM_PB_CAPA = 10013; + static final int RIL_REQUEST_LOCK_INFO = 10014; + static final int RIL_REQUEST_DIAL_EMERGENCY = 10016; - static final int RIL_UNSOL_STK_SEND_SMS_RESULT = 11002; + static final int RIL_REQUEST_GET_STOREAD_MSG_COUNT = 10017; + static final int RIL_REQUEST_STK_SIM_INIT_EVENT = 10018; + static final int RIL_REQUEST_GET_LINE_ID = 10019; + static final int RIL_REQUEST_SET_LINE_ID = 10020; + static final int RIL_REQUEST_GET_SERIAL_NUMBER = 10021; + static final int RIL_REQUEST_GET_MANUFACTURE_DATE_NUMBER = 10022; + static final int RIL_REQUEST_GET_BARCODE_NUMBER = 10023; + static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_BOOTSTRAP = 10024; + static final int RIL_REQUEST_UICC_GBA_AUTHENTICATE_NAF = 10025; + static final int RIL_REQUEST_SIM_TRANSMIT_BASIC = 10026; + static final int RIL_REQUEST_SIM_OPEN_CHANNEL = 10027; + static final int RIL_REQUEST_SIM_CLOSE_CHANNEL = 10028; + static final int RIL_REQUEST_SIM_TRANSMIT_CHANNEL = 10029; + static final int RIL_REQUEST_SIM_AUTH = 10030; + static final int RIL_REQUEST_PS_ATTACH = 10031; + static final int RIL_REQUEST_PS_DETACH = 10032; + static final int RIL_REQUEST_ACTIVATE_DATA_CALL = 10033; + static final int RIL_REQUEST_CHANGE_SIM_PERSO = 10034; + static final int RIL_REQUEST_ENTER_SIM_PERSO = 10035; + static final int RIL_REQUEST_GET_TIME_INFO = 10036; + static final int RIL_REQUEST_OMADM_SETUP_SESSION = 10037; + static final int RIL_REQUEST_OMADM_SERVER_START_SESSION = 10038; + static final int RIL_REQUEST_OMADM_CLIENT_START_SESSION = 10039; + static final int RIL_REQUEST_OMADM_SEND_DATA = 10040; + static final int RIL_REQUEST_CDMA_GET_DATAPROFILE = 10041; + static final int RIL_REQUEST_CDMA_SET_DATAPROFILE = 10042; + static final int RIL_REQUEST_CDMA_GET_SYSTEMPROPERTIES = 10043; + static final int RIL_REQUEST_CDMA_SET_SYSTEMPROPERTIES = 10044; + static final int RIL_REQUEST_SEND_SMS_COUNT = 10045; + static final int RIL_REQUEST_SEND_SMS_MSG = 10046; + static final int RIL_REQUEST_SEND_SMS_MSG_READ_STATUS = 10047; + static final int RIL_REQUEST_MODEM_HANGUP = 10048; + static final int RIL_REQUEST_SET_SIM_POWER = 10049; + static final int RIL_REQUEST_SET_PREFERRED_NETWORK_LIST = 10050; + static final int RIL_REQUEST_GET_PREFERRED_NETWORK_LIST = 10051; + static final int RIL_REQUEST_HANGUP_VT = 10052; + + static final int RIL_UNSOL_RELEASE_COMPLETE_MESSAGE = 11001; + //static final int RIL_UNSOL_STK_SEND_SMS_RESULT = 11002; + static final int RIL_UNSOL_STK_CALL_CONTROL_RESULT = 11003; + static final int RIL_UNSOL_DUN_CALL_STATUS = 11004; + static final int RIL_UNSOL_O2_HOME_ZONE_INFO = 11007; static final int RIL_UNSOL_DEVICE_READY_NOTI = 11008; - static final int RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_1 = 11010; - static final int RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_2 = 11011; - static final int RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_3 = 11012; + static final int RIL_UNSOL_GPS_NOTI = 11009; + static final int RIL_UNSOL_AM = 11010; + static final int RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL = 11011; + static final int RIL_UNSOL_DATA_SUSPEND_RESUME = 11012; + static final int RIL_UNSOL_SAP = 11013; + + static final int RIL_UNSOL_SIM_SMS_STORAGE_AVAILALE = 11015; static final int RIL_UNSOL_HSDPA_STATE_CHANGED = 11016; + static final int RIL_UNSOL_WB_AMR_STATE = 11017; + static final int RIL_UNSOL_TWO_MIC_STATE = 11018; + static final int RIL_UNSOL_DHA_STATE = 11019; + static final int RIL_UNSOL_UART = 11020; + static final int RIL_UNSOL_RESPONSE_HANDOVER = 11021; + static final int RIL_UNSOL_IPV6_ADDR = 11022; + static final int RIL_UNSOL_NWK_INIT_DISC_REQUEST = 11023; + static final int RIL_UNSOL_RTS_INDICATION = 11024; + static final int RIL_UNSOL_OMADM_SEND_DATA = 11025; + static final int RIL_UNSOL_DUN = 11026; + static final int RIL_UNSOL_SYSTEM_REBOOT = 11027; + static final int RIL_UNSOL_VOICE_PRIVACY_CHANGED = 11028; + static final int RIL_UNSOL_UTS_GETSMSCOUNT = 11029; + static final int RIL_UNSOL_UTS_GETSMSMSG = 11030; + static final int RIL_UNSOL_UTS_GET_UNREAD_SMS_STATUS = 11031; + static final int RIL_UNSOL_MIP_CONNECT_STATUS = 11032; + protected HandlerThread mSmdk4210Thread; protected ConnectivityHandler mSmdk4210Handler; + private AudioManager audioManager; public Smdk4210RIL(Context context, int networkMode, int cdmaSubscription) { super(context, networkMode, cdmaSubscription); + audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); } @Override @@ -422,9 +500,12 @@ public class Smdk4210RIL extends RIL implements CommandsInterface { case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: ret = responseString(p); break; case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break; // SAMSUNG STATES - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_1: ret = responseVoid(p); break; - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_2: ret = responseVoid(p); break; - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_3: ret = responseVoid(p); break; + case RIL_UNSOL_AM: ret = responseVoid(p); break; + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: ret = responseVoid(p); break; + case RIL_UNSOL_DATA_SUSPEND_RESUME: ret = responseInts(p); break; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: ret = responseVoid(p); break; + case RIL_UNSOL_TWO_MIC_STATE: ret = responseInts(p); break; + case RIL_UNSOL_WB_AMR_STATE: ret = responseInts(p); break; default: // Rewind the Parcel @@ -454,13 +535,55 @@ public class Smdk4210RIL extends RIL implements CommandsInterface { notifyRegistrantsRilConnectionChanged(((int[])ret)[0]); break; // SAMSUNG STATES - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_1: - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_2: - case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_3: + case RIL_UNSOL_AM: + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: + case RIL_UNSOL_DATA_SUSPEND_RESUME: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_TWO_MIC_STATE: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + break; + case RIL_UNSOL_WB_AMR_STATE: + if (RILJ_LOGD) samsungUnsljLogRet(response, ret); + setWbAmr(((int[])ret)[0]); break; } } + static String + samsungResponseToString(int request) + { + switch(request) { + // SAMSUNG STATES + case RIL_UNSOL_AM: return "RIL_UNSOL_AM"; + case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: return "RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL"; + case RIL_UNSOL_DATA_SUSPEND_RESUME: return "RIL_UNSOL_DATA_SUSPEND_RESUME"; + case RIL_UNSOL_STK_CALL_CONTROL_RESULT: return "RIL_UNSOL_STK_CALL_CONTROL_RESULT"; + case RIL_UNSOL_TWO_MIC_STATE: return "RIL_UNSOL_TWO_MIC_STATE"; + case RIL_UNSOL_WB_AMR_STATE: return "RIL_UNSOL_WB_AMR_STATE"; + default: return "<unknown response: "+request+">"; + } + } + + protected void samsungUnsljLog(int response) { + riljLog("[UNSL]< " + samsungResponseToString(response)); + } + + protected void samsungUnsljLogMore(int response, String more) { + riljLog("[UNSL]< " + samsungResponseToString(response) + " " + more); + } + + protected void samsungUnsljLogRet(int response, Object ret) { + riljLog("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); + } + + protected void samsungUnsljLogvRet(int response, Object ret) { + riljLogv("[UNSL]< " + samsungResponseToString(response) + " " + retToString(response, ret)); + } + /** * Notifiy all registrants that the ril has connected or disconnected. * @@ -474,6 +597,21 @@ public class Smdk4210RIL extends RIL implements CommandsInterface { } } + /** + * Set audio parameter "wb_amr" for HD-Voice (Wideband AMR). + * + * @param state: 0 = unsupported, 1 = supported. + */ + private void setWbAmr(int state) { + if (state == 1) { + Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=on"); + audioManager.setParameters("wb_amr=on"); + } else { + Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=off"); + audioManager.setParameters("wb_amr=off"); + } + } + @Override protected Object responseCallList(Parcel p) { @@ -620,20 +758,29 @@ public class Smdk4210RIL extends RIL implements CommandsInterface { int numInts = 12; int response[]; - /* TODO: Add SignalStrength class to match RIL_SignalStrength */ + // Get raw data response = new int[numInts]; for (int i = 0 ; i < numInts ; i++) { response[i] = p.readInt(); } - // SamsungRIL is a v3 RIL, fill the rest with -1 - for (int i = 7; i < numInts; i++) { - response[i] = -1; + Log.d(LOG_TAG, "responseSignalStength BEFORE: gsmDbm=" + response[0]); + + //Samsung sends the count of bars that should be displayed instead of + //a real signal strength + int num_bars = (response[0] & 0xff00) >> 8; + + // Translate number of bars into something SignalStrength.java can understand + switch (num_bars) { + case 0 : response[0] = 1; break; // map to 0 bars + case 1 : response[0] = 3; break; // map to 1 bar + case 2 : response[0] = 5; break; // map to 2 bars + case 3 : response[0] = 8; break; // map to 3 bars + case 4 : response[0] = 12; break; // map to 4 bars + case 5 : response[0] = 15; break; // map to 4 bars but give an extra 10 dBm + default : response[0] &= 0xff; break; // no idea; just pass value through } - /* Matching Samsung signal strength to asu. - Method taken from Samsungs cdma/gsmSignalStateTracker */ - response[0] = ((response[0] & 0xFF00) >> 8) * 3; //gsmDbm response[1] = -1; //gsmEcio response[2] = (response[2] < 0)?-120:-response[2]; //cdmaDbm response[3] = (response[3] < 0)?-160:-response[3]; //cdmaEcio @@ -643,6 +790,8 @@ public class Smdk4210RIL extends RIL implements CommandsInterface { response[6] = -1; } + Log.d(LOG_TAG, "responseSignalStength AFTER: gsmDbm=" + response[0]); + return response; } } diff --git a/telephony/java/com/android/internal/telephony/cat/CallControlResult.java b/telephony/java/com/android/internal/telephony/cat/CallControlResult.java new file mode 100644 index 0000000..2dbc0d4 --- /dev/null +++ b/telephony/java/com/android/internal/telephony/cat/CallControlResult.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony.cat; + + +public enum CallControlResult { + + CALL_CONTROL_NO_CONTROL(0x00), + CALL_CONTROL_ALLOWED_NO_MOD(0x01), + CALL_CONTROL_NOT_ALLOWED(0x02), + CALL_CONTROL_ALLOWED_WITH_MOD(0x03); + private int mValue; + + CallControlResult(int value) { + mValue = value; + } + + public static CallControlResult fromInt(int value) { + for (CallControlResult e : CallControlResult.values()) { + if (e.mValue == value) { + return e; + } + } + return null; + } + + public int value() { + return mValue; + } +} diff --git a/telephony/java/com/android/internal/telephony/cat/CatService.java b/telephony/java/com/android/internal/telephony/cat/CatService.java index 74af9fa..cd6f9b4 100644 --- a/telephony/java/com/android/internal/telephony/cat/CatService.java +++ b/telephony/java/com/android/internal/telephony/cat/CatService.java @@ -25,13 +25,14 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.os.SystemProperties; +import android.widget.Toast; import com.android.internal.telephony.IccUtils; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccFileHandler; import com.android.internal.telephony.IccRecords; - +import com.android.internal.telephony.IccSmsInterfaceManager; import java.io.ByteArrayOutputStream; import java.util.List; @@ -73,6 +74,9 @@ public class CatService extends Handler implements AppInterface { private Context mContext; private CatCmdMessage mCurrntCmd = null; private CatCmdMessage mMenuCmd = null; + private IccSmsInterfaceManager mIccSms = null; + private int mTimeoutDest = 0; + private int mCallControlResultCode = 0; private RilMessageDecoder mMsgDecoder = null; private boolean mStkAppInstalled = false; @@ -85,8 +89,10 @@ public class CatService extends Handler implements AppInterface { static final int MSG_ID_REFRESH = 5; static final int MSG_ID_RESPONSE = 6; static final int MSG_ID_SIM_READY = 7; + static final int MSG_ID_TIMEOUT = 9; static final int MSG_ID_RIL_MSG_DECODED = 10; + static final int MSG_ID_SEND_SMS_RESULT = 12;//samsung ril response // Events to signal SIM presence or absent in the device. private static final int MSG_ID_ICC_RECORDS_LOADED = 20; @@ -100,17 +106,25 @@ public class CatService extends Handler implements AppInterface { static final String STK_DEFAULT = "Defualt Message"; + // Sms send result constants. + static final int SMS_SEND_OK = 0; + static final int SMS_SEND_FAIL = 32790; + static final int SMS_SEND_RETRY = 32810; + + static final int WAITING_SMS_RESULT = 2; + static final int WAITING_SMS_RESULT_TIME = 60000; + /* Intentionally private for singleton */ private CatService(CommandsInterface ci, IccRecords ir, Context context, - IccFileHandler fh, IccCard ic) { + IccFileHandler fh, IccCard ic, IccSmsInterfaceManager iccSmsInt) { if (ci == null || ir == null || context == null || fh == null - || ic == null) { + || ic == null || iccSmsInt == null) { throw new NullPointerException( "Service: Input parameters must not be null"); } mCmdIf = ci; mContext = context; - + mIccSms = iccSmsInt; // Get the RilMessagesDecoder for decoding the messages. mMsgDecoder = RilMessageDecoder.getInstance(this, fh); @@ -119,6 +133,8 @@ public class CatService extends Handler implements AppInterface { mCmdIf.setOnCatProactiveCmd(this, MSG_ID_PROACTIVE_COMMAND, null); mCmdIf.setOnCatEvent(this, MSG_ID_EVENT_NOTIFY, null); mCmdIf.setOnCatCallSetUp(this, MSG_ID_CALL_SETUP, null); + // samsung ril sms send result + mCmdIf.setOnCatSendSmsResult(this, MSG_ID_SEND_SMS_RESULT, null); //mCmdIf.setOnSimRefresh(this, MSG_ID_REFRESH, null); mIccRecords = ir; @@ -141,6 +157,7 @@ public class CatService extends Handler implements AppInterface { mCmdIf.unSetOnCatProactiveCmd(this); mCmdIf.unSetOnCatEvent(this); mCmdIf.unSetOnCatCallSetUp(this); + mCmdIf.unSetOnCatSendSmsResult(this); this.removeCallbacksAndMessages(null); } @@ -267,6 +284,19 @@ public class CatService extends Handler implements AppInterface { break; case SEND_DTMF: case SEND_SMS: + if (mContext.getResources(). + getBoolean(com.android.internal.R.bool.config_samsung_stk)) { + handleProactiveCommandSendSMS(cmdParams); + if (((DisplayTextParams)cmdParams).textMsg == null + || ((DisplayTextParams)cmdParams).textMsg.text == null) + break; + if (((DisplayTextParams)cmdParams).textMsg.text.equals(STK_DEFAULT)) { + message = mContext.getText(com.android.internal.R.string.sending); + ((DisplayTextParams)cmdParams).textMsg.text = message.toString(); + Toast.makeText(mContext, ((DisplayTextParams)cmdParams).textMsg.text, 1).show(); + } + } + break; case SEND_SS: case SEND_USSD: if ((((DisplayTextParams)cmdParams).textMsg.text != null) @@ -556,16 +586,16 @@ public class CatService extends Handler implements AppInterface { * @return The only Service object in the system */ public static CatService getInstance(CommandsInterface ci, IccRecords ir, - Context context, IccFileHandler fh, IccCard ic) { + Context context, IccFileHandler fh, IccCard ic, IccSmsInterfaceManager iccSmsInt) { synchronized (sInstanceLock) { if (sInstance == null) { if (ci == null || ir == null || context == null || fh == null - || ic == null) { + || ic == null || iccSmsInt == null) { return null; } HandlerThread thread = new HandlerThread("Cat Telephony service"); thread.start(); - sInstance = new CatService(ci, ir, context, fh, ic); + sInstance = new CatService(ci, ir, context, fh, ic, iccSmsInt); CatLog.d(sInstance, "NEW sInstance"); } else if ((ir != null) && (mIccRecords != ir)) { CatLog.d(sInstance, "Reinitialize the Service with SIMRecords"); @@ -587,7 +617,7 @@ public class CatService extends Handler implements AppInterface { * @return The only Service object in the system */ public static AppInterface getInstance() { - return getInstance(null, null, null, null, null); + return getInstance(null, null, null, null, null, null); } @Override @@ -627,6 +657,64 @@ public class CatService extends Handler implements AppInterface { CatLog.d(this, "SIM ready. Reporting STK service running now..."); mCmdIf.reportStkServiceIsRunning(null); break; + // Samsung ril sms send handling part + case MSG_ID_SEND_SMS_RESULT: + if (mContext.getResources(). + getBoolean(com.android.internal.R.bool.config_samsung_stk)) { + int[] sendResult; + AsyncResult ar; + CatLog.d(this, "handleMsg : MSG_ID_SEND_SMS_RESULT"); + cancelTimeOut(); + CatLog.d(this, "The Msg ID data:" + msg.what); + if (msg.obj == null) + break; + ar = (AsyncResult) msg.obj; + if (ar == null || ar.result == null || mCurrntCmd == null || mCurrntCmd.mCmdDet == null) + break; + sendResult = (int[]) ar.result; + switch (sendResult[0]) { + default: + CatLog.d(this, "SMS SEND GENERIC FAIL"); + if (CallControlResult.fromInt(mCallControlResultCode) == + CallControlResult.CALL_CONTROL_NOT_ALLOWED) + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.USIM_CALL_CONTROL_PERMANENT, true, 1, null); + else + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.TERMINAL_CRNTLY_UNABLE_TO_PROCESS, false, 0, null); + break; + case SMS_SEND_OK: // '\0' + CatLog.d(this, "SMS SEND OK"); + if (CallControlResult.fromInt(mCallControlResultCode) == + CallControlResult.CALL_CONTROL_NOT_ALLOWED) + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.USIM_CALL_CONTROL_PERMANENT, true, 1, null); + else + sendTerminalResponse(mCurrntCmd.mCmdDet, ResultCode.OK, false, 0, null); + break; + case SMS_SEND_FAIL: + CatLog.d(this, "SMS SEND FAIL - MEMORY NOT AVAILABLE"); + if (CallControlResult.fromInt(mCallControlResultCode) == + CallControlResult.CALL_CONTROL_NOT_ALLOWED) + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.USIM_CALL_CONTROL_PERMANENT, true, 1, null); + else + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.TERMINAL_CRNTLY_UNABLE_TO_PROCESS, false, 0, null); + break; + case SMS_SEND_RETRY: + CatLog.d(this, "SMS SEND FAIL RETRY"); + if (CallControlResult.fromInt(mCallControlResultCode) == + CallControlResult.CALL_CONTROL_NOT_ALLOWED) + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.USIM_CALL_CONTROL_PERMANENT, true, 1, null); + else + sendTerminalResponse(mCurrntCmd.mCmdDet, + ResultCode.NETWORK_CRNTLY_UNABLE_TO_PROCESS, false, 0, null); + break; + } + } + break; default: throw new AssertionError("Unrecognized CAT command: " + msg.what); } @@ -749,4 +837,27 @@ public class CatService extends Handler implements AppInterface { return (numReceiver > 0); } + + /** + * samsung send sms + * @param cmdPar + */ + private void handleProactiveCommandSendSMS(CommandParams cmdPar) { + CatLog.d(this, "The smscaddress is: " + ((SendSMSParams)cmdPar).smscAddress); + CatLog.d(this, "The SMS tpdu is: " + ((SendSMSParams)cmdPar).pdu); + mIccSms.sendRawPduSat(IccUtils.hexStringToBytes(((SendSMSParams)cmdPar).smscAddress), + IccUtils.hexStringToBytes(((SendSMSParams)cmdPar).pdu), null, null); + startTimeOut(WAITING_SMS_RESULT, WAITING_SMS_RESULT_TIME); + } + + private void cancelTimeOut() { + removeMessages(MSG_ID_TIMEOUT); + mTimeoutDest = 0; + } + + private void startTimeOut(int timeout, int delay) { + cancelTimeOut(); + mTimeoutDest = timeout; + sendMessageDelayed(obtainMessage(MSG_ID_TIMEOUT), delay); + } } diff --git a/telephony/java/com/android/internal/telephony/cat/CommandParams.java b/telephony/java/com/android/internal/telephony/cat/CommandParams.java index 959c9e2..31e8bbdb 100644 --- a/telephony/java/com/android/internal/telephony/cat/CommandParams.java +++ b/telephony/java/com/android/internal/telephony/cat/CommandParams.java @@ -192,3 +192,14 @@ class BIPClientParams extends CommandParams { return false; } } + +class SendSMSParams extends DisplayTextParams { + String pdu; + String smscAddress; + + SendSMSParams(CommandDetails cmdDet, TextMessage textmessage, String smscaddress, String smsPdu) { + super(cmdDet, textmessage); + smscAddress = smscaddress; + pdu = smsPdu; + } +} diff --git a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java index 89c1329..5b8ec5b 100644 --- a/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java +++ b/telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java @@ -16,6 +16,7 @@ package com.android.internal.telephony.cat; +import android.content.res.Resources; import android.graphics.Bitmap; import android.os.Handler; import android.os.Message; @@ -134,43 +135,43 @@ class CommandParamsFactory extends Handler { case DISPLAY_TEXT: cmdPending = processDisplayText(cmdDet, ctlvs); break; - case SET_UP_IDLE_MODE_TEXT: - cmdPending = processSetUpIdleModeText(cmdDet, ctlvs); - break; - case GET_INKEY: + case SET_UP_IDLE_MODE_TEXT: + cmdPending = processSetUpIdleModeText(cmdDet, ctlvs); + break; + case GET_INKEY: cmdPending = processGetInkey(cmdDet, ctlvs); break; - case GET_INPUT: - cmdPending = processGetInput(cmdDet, ctlvs); - break; - case SEND_DTMF: - case SEND_SMS: - case SEND_SS: - case SEND_USSD: - cmdPending = processEventNotify(cmdDet, ctlvs); - break; - case SET_UP_CALL: - cmdPending = processSetupCall(cmdDet, ctlvs); - break; - case REFRESH: + case GET_INPUT: + cmdPending = processGetInput(cmdDet, ctlvs); + break; + case SEND_DTMF: + case SEND_SMS: + case SEND_SS: + case SEND_USSD: + cmdPending = processEventNotify(cmdDet, ctlvs); + break; + case SET_UP_CALL: + cmdPending = processSetupCall(cmdDet, ctlvs); + break; + case REFRESH: processRefresh(cmdDet, ctlvs); cmdPending = false; break; - case LAUNCH_BROWSER: - cmdPending = processLaunchBrowser(cmdDet, ctlvs); - break; - case PLAY_TONE: + case LAUNCH_BROWSER: + cmdPending = processLaunchBrowser(cmdDet, ctlvs); + break; + case PLAY_TONE: cmdPending = processPlayTone(cmdDet, ctlvs); break; - case PROVIDE_LOCAL_INFORMATION: + case PROVIDE_LOCAL_INFORMATION: cmdPending = processProvideLocalInfo(cmdDet, ctlvs); break; - case OPEN_CHANNEL: - case CLOSE_CHANNEL: - case RECEIVE_DATA: - case SEND_DATA: - cmdPending = processBIPClient(cmdDet, ctlvs); - break; + case OPEN_CHANNEL: + case CLOSE_CHANNEL: + case RECEIVE_DATA: + case SEND_DATA: + cmdPending = processBIPClient(cmdDet, ctlvs); + break; default: // unsupported proactive commands mCmdParams = new CommandParams(cmdDet); @@ -641,7 +642,34 @@ class CommandParamsFactory extends Handler { } textMsg.responseNeeded = false; - mCmdParams = new DisplayTextParams(cmdDet, textMsg); + + // samsung stk overlay + if (Resources.getSystem().getBoolean(com.android.internal.R.bool.config_samsung_stk)) { + String smscAddress = null; + String pdu = null; + + ctlv = searchForTag(ComprehensionTlvTag.ADDRESS, ctlvs); + if (ctlv != null) { + smscAddress = ValueParser.retrieveSMSCaddress(ctlv); + CatLog.d(this, "The smsc address is " + smscAddress); + } + else { + CatLog.d(this, "The smsc address is null"); + } + + ctlv = searchForTag(ComprehensionTlvTag.SMS_TPDU, ctlvs); + if (ctlv != null) { + pdu = ValueParser.retrieveSMSTPDU(ctlv); + CatLog.d(this, "The SMS tpdu is " + pdu); + } + else { + CatLog.d(this, "The SMS tpdu is null"); + } + mCmdParams = new SendSMSParams(cmdDet, textMsg, smscAddress, pdu); + } + else { + mCmdParams = new DisplayTextParams(cmdDet, textMsg); + } if (iconId != null) { mIconLoadState = LOAD_SINGLE_ICON; diff --git a/telephony/java/com/android/internal/telephony/cat/ValueParser.java b/telephony/java/com/android/internal/telephony/cat/ValueParser.java index 584d96c..66c0c67 100644 --- a/telephony/java/com/android/internal/telephony/cat/ValueParser.java +++ b/telephony/java/com/android/internal/telephony/cat/ValueParser.java @@ -338,4 +338,71 @@ abstract class ValueParser { throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); } } + + /** + * samsung part for converting byte[] to hexstring + * @param ctlv + * @return + * @throws ResultException + */ + static String retrieveSMSCaddress(ComprehensionTlv ctlv) + throws ResultException { + byte[] rawValue = ctlv.getRawValue(); + int valueIndex = ctlv.getValueIndex(); + int length = ctlv.getLength(); + byte[] outputValue = new byte[length + 1]; + + for (int k = 0; k <= length; k++) { + try { + outputValue[k] = rawValue[k + (valueIndex - 1)]; + } + catch (IndexOutOfBoundsException indexoutofboundsexception) { + throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); + } + } + if (length != 0) + return IccUtils.bytesToHexString(outputValue); + else + throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); + } + + /** + * + * @param ctlv + * @return + * @throws ResultException + */ + static String retrieveSMSTPDU(ComprehensionTlv ctlv) + throws ResultException { + byte[] rawValue = ctlv.getRawValue(); + int valueIndex = ctlv.getValueIndex(); + int pduLength = ctlv.getLength(); + byte[] outputValue; + int k; + String result; + if (rawValue[valueIndex + 2] % 2 == 0) + k = rawValue[valueIndex + 2] / 2; + else + k = (1 + rawValue[valueIndex + 2]) / 2; + + if (pduLength == k + 6) + outputValue = new byte[pduLength + 1]; + else + outputValue = new byte[pduLength]; + + for (int l = 0; l < pduLength; l++) { + try { + outputValue[l] = rawValue[valueIndex + l]; + } + catch (IndexOutOfBoundsException ex) { + throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); + } + } + if (pduLength != 0) + result = IccUtils.bytesToHexString(outputValue); + else + throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); + + return result; + } } diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index 58e3e5f..276c6c5 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -165,7 +165,7 @@ public class CDMAPhone extends PhoneBase { mSubInfo = new PhoneSubInfo(this); mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML); mCcatService = CatService.getInstance(mCM, mIccRecords, mContext, - mIccFileHandler, mIccCard); + mIccFileHandler, mIccCard, mRuimSmsInterfaceManager); mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null); diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java index bd80ca9..3a30f9c 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java +++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java @@ -147,7 +147,8 @@ public class GSMPhone extends PhoneBase { mSimSmsIntManager = new SimSmsInterfaceManager(this, mSMS); mSubInfo = new PhoneSubInfo(this); } - mStkService = CatService.getInstance(mCM, mIccRecords, mContext, mIccFileHandler, mIccCard); + mStkService = CatService.getInstance(mCM, mIccRecords, mContext, mIccFileHandler, mIccCard, + mSimSmsIntManager); mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); diff --git a/telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java b/telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java index 583b1a5..e2ba8bf 100644 --- a/telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java +++ b/telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java @@ -414,4 +414,16 @@ class SipCommandInterface extends BaseCommands implements CommandsInterface { } public boolean needsOldRilFeature(String feature) { return false; } + + /** + * added samsung part to command interface + * @param h + * @param what + * @param obj + */ + public void setOnCatSendSmsResult(Handler h, int what, Object obj) { + } + + public void unSetOnCatSendSmsResult(Handler h) { + } } diff --git a/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java b/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java index 710faa6..e662cd3 100644 --- a/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java +++ b/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java @@ -17,6 +17,7 @@ package com.android.internal.telephony.test; import android.os.AsyncResult; +import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; @@ -1519,4 +1520,20 @@ public final class SimulatedCommands extends BaseCommands } public boolean needsOldRilFeature(String feature) { return false; } + + /** + * added samsung part to command interface + * @param h + * @param what + * @param obj + */ + public void setOnCatSendSmsResult(Handler h, int what, Object obj) { + } + + /** + * + * @param h + */ + public void unSetOnCatSendSmsResult(Handler h) { + } } |