summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt15
-rw-r--r--cmds/servicemanager/service_manager.c1
-rw-r--r--core/java/android/hardware/Camera.java8
-rw-r--r--core/java/android/provider/Settings.java47
-rw-r--r--core/java/android/text/method/QwertyKeyListener.java6
-rw-r--r--core/java/android/view/KeyCharacterMap.java12
-rwxr-xr-xcore/java/android/view/KeyEvent.java73
-rwxr-xr-xcore/res/res/values/attrs.xml13
-rwxr-xr-xcore/res/res/values/config.xml10
-rwxr-xr-xcore/res/res/values/strings.xml4
-rw-r--r--include/camera/CameraParameters.h14
-rwxr-xr-xinclude/ui/KeycodeLabels.h13
-rw-r--r--libs/camera/CameraParameters.cpp8
-rw-r--r--libs/hwui/LayerRenderer.cpp2
-rw-r--r--media/java/android/media/MediaRecorder.java22
-rw-r--r--native/include/android/keycodes.h13
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java3
-rw-r--r--services/input/InputDispatcher.cpp2
-rw-r--r--services/java/com/android/server/BatteryService.java147
-rw-r--r--services/java/com/android/server/RotationSwitchObserver.java163
-rw-r--r--services/java/com/android/server/SystemServer.java20
-rw-r--r--services/java/com/android/server/wm/ScreenRotationAnimation.java32
-rw-r--r--telephony/java/com/android/internal/telephony/CommandsInterface.java7
-rw-r--r--telephony/java/com/android/internal/telephony/IccSmsInterfaceManager.java13
-rw-r--r--telephony/java/com/android/internal/telephony/RIL.java37
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java1
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java364
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungQualcommUiccRIL.java56
-rw-r--r--telephony/java/com/android/internal/telephony/Smdk4210RIL.java185
-rw-r--r--telephony/java/com/android/internal/telephony/cat/CallControlResult.java44
-rw-r--r--telephony/java/com/android/internal/telephony/cat/CatService.java127
-rw-r--r--telephony/java/com/android/internal/telephony/cat/CommandParams.java11
-rw-r--r--telephony/java/com/android/internal/telephony/cat/CommandParamsFactory.java86
-rw-r--r--telephony/java/com/android/internal/telephony/cat/ValueParser.java67
-rwxr-xr-xtelephony/java/com/android/internal/telephony/cdma/CDMAPhone.java2
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GSMPhone.java3
-rw-r--r--telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java12
-rw-r--r--telephony/java/com/android/internal/telephony/test/SimulatedCommands.java17
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) {
+ }
}