summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt15
-rw-r--r--core/java/android/hardware/Camera.java8
-rw-r--r--core/java/android/provider/Settings.java8
-rw-r--r--core/java/android/text/method/QwertyKeyListener.java131
-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.xml7
-rwxr-xr-xcore/res/res/values/strings.xml59
-rw-r--r--include/camera/CameraParameters.h14
-rwxr-xr-xinclude/ui/KeycodeLabels.h13
-rw-r--r--libs/camera/CameraParameters.cpp8
-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--packages/SystemUI/res/layout-sw600dp/status_bar_settings_button.xml15
-rw-r--r--packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml151
-rw-r--r--packages/SystemUI/res/values/styles.xml23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java135
-rw-r--r--services/input/InputDispatcher.cpp2
-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.java72
-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/gsm/GsmServiceStateTracker.java6
-rw-r--r--telephony/java/com/android/internal/telephony/sip/SipCommandInterface.java12
-rw-r--r--telephony/java/com/android/internal/telephony/test/SimulatedCommands.java17
40 files changed, 1458 insertions, 407 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/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 83e28e4..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).
*/
@@ -2618,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..8c37daa 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;
@@ -423,78 +429,75 @@ public class QwertyKeyListener extends BaseKeyListener {
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
- private static SparseArray<String> PICKER_SETS =
- new SparseArray<String>();
+ private static SparseArray<Integer> SYM_PICKER_RES_ID =
+ new SparseArray<Integer>();
+
static {
- PICKER_SETS.put('A', "\u00C0\u00C1\u00C2\u00C4\u00C6\u00C3\u00C5\u0104\u0100");
- PICKER_SETS.put('C', "\u00C7\u0106\u010C");
- PICKER_SETS.put('D', "\u010E");
- PICKER_SETS.put('E', "\u00C8\u00C9\u00CA\u00CB\u0118\u011A\u0112");
- PICKER_SETS.put('G', "\u011E");
- PICKER_SETS.put('L', "\u0141");
- PICKER_SETS.put('I', "\u00CC\u00CD\u00CE\u00CF\u012A\u0130");
- PICKER_SETS.put('N', "\u00D1\u0143\u0147");
- PICKER_SETS.put('O', "\u00D8\u0152\u00D5\u00D2\u00D3\u00D4\u00D6\u014C");
- PICKER_SETS.put('R', "\u0158");
- PICKER_SETS.put('S', "\u015A\u0160\u015E");
- PICKER_SETS.put('T', "\u0164");
- PICKER_SETS.put('U', "\u00D9\u00DA\u00DB\u00DC\u016E\u016A");
- PICKER_SETS.put('Y', "\u00DD\u0178");
- PICKER_SETS.put('Z', "\u0179\u017B\u017D");
- PICKER_SETS.put('a', "\u00E0\u00E1\u00E2\u00E4\u00E6\u00E3\u00E5\u0105\u0101");
- PICKER_SETS.put('c', "\u00E7\u0107\u010D");
- PICKER_SETS.put('d', "\u010F");
- PICKER_SETS.put('e', "\u00E8\u00E9\u00EA\u00EB\u0119\u011B\u0113");
- PICKER_SETS.put('g', "\u011F");
- PICKER_SETS.put('i', "\u00EC\u00ED\u00EE\u00EF\u012B\u0131");
- PICKER_SETS.put('l', "\u0142");
- PICKER_SETS.put('n', "\u00F1\u0144\u0148");
- PICKER_SETS.put('o', "\u00F8\u0153\u00F5\u00F2\u00F3\u00F4\u00F6\u014D");
- PICKER_SETS.put('r', "\u0159");
- PICKER_SETS.put('s', "\u00A7\u00DF\u015B\u0161\u015F");
- PICKER_SETS.put('t', "\u0165");
- PICKER_SETS.put('u', "\u00F9\u00FA\u00FB\u00FC\u016F\u016B");
- PICKER_SETS.put('y', "\u00FD\u00FF");
- PICKER_SETS.put('z', "\u017A\u017C\u017E");
- PICKER_SETS.put(KeyCharacterMap.PICKER_DIALOG_INPUT,
- "\u2026\u00A5\u2022\u00AE\u00A9\u00B1[]{}<>`^\\|");
- PICKER_SETS.put('/', "\\");
-
- // From packages/inputmethods/LatinIME/res/xml/kbd_symbols.xml
-
- PICKER_SETS.put('1', "\u00b9\u00bd\u2153\u00bc\u215b");
- PICKER_SETS.put('2', "\u00b2\u2154");
- PICKER_SETS.put('3', "\u00b3\u00be\u215c");
- PICKER_SETS.put('4', "\u2074");
- PICKER_SETS.put('5', "\u215d");
- PICKER_SETS.put('7', "\u215e");
- PICKER_SETS.put('0', "\u207f\u2205");
- PICKER_SETS.put('$', "\u00a2\u00a3\u20ac\u00a5\u20a3\u20a4\u20b1");
- PICKER_SETS.put('%', "\u2030");
- PICKER_SETS.put('*', "\u2020\u2021");
- PICKER_SETS.put('-', "\u2013\u2014");
- PICKER_SETS.put('+', "\u00b1");
- PICKER_SETS.put('(', "[{<");
- PICKER_SETS.put(')', "]}>");
- PICKER_SETS.put('!', "\u00a1");
- PICKER_SETS.put('"', "\u201c\u201d\u00ab\u00bb\u02dd");
- PICKER_SETS.put('?', "\u00bf");
- PICKER_SETS.put(',', "\u201a\u201e");
-
- // From packages/inputmethods/LatinIME/res/xml/kbd_symbols_shift.xml
-
- PICKER_SETS.put('=', "\u2260\u2248\u221e");
- PICKER_SETS.put('<', "\u2264\u00ab\u2039");
- PICKER_SETS.put('>', "\u2265\u00bb\u203a");
+ SYM_PICKER_RES_ID.put('A', com.android.internal.R.string.symbol_picker_A);
+ SYM_PICKER_RES_ID.put('C', com.android.internal.R.string.symbol_picker_C);
+ SYM_PICKER_RES_ID.put('D', com.android.internal.R.string.symbol_picker_D);
+ SYM_PICKER_RES_ID.put('E', com.android.internal.R.string.symbol_picker_E);
+ SYM_PICKER_RES_ID.put('G', com.android.internal.R.string.symbol_picker_G);
+ SYM_PICKER_RES_ID.put('L', com.android.internal.R.string.symbol_picker_L);
+ SYM_PICKER_RES_ID.put('I', com.android.internal.R.string.symbol_picker_I);
+ SYM_PICKER_RES_ID.put('N', com.android.internal.R.string.symbol_picker_N);
+ SYM_PICKER_RES_ID.put('O', com.android.internal.R.string.symbol_picker_O);
+ SYM_PICKER_RES_ID.put('R', com.android.internal.R.string.symbol_picker_R);
+ SYM_PICKER_RES_ID.put('S', com.android.internal.R.string.symbol_picker_S);
+ SYM_PICKER_RES_ID.put('T', com.android.internal.R.string.symbol_picker_T);
+ SYM_PICKER_RES_ID.put('U', com.android.internal.R.string.symbol_picker_U);
+ SYM_PICKER_RES_ID.put('Y', com.android.internal.R.string.symbol_picker_Y);
+ SYM_PICKER_RES_ID.put('Z', com.android.internal.R.string.symbol_picker_Z);
+ SYM_PICKER_RES_ID.put('a', com.android.internal.R.string.symbol_picker_a);
+ SYM_PICKER_RES_ID.put('c', com.android.internal.R.string.symbol_picker_c);
+ SYM_PICKER_RES_ID.put('d', com.android.internal.R.string.symbol_picker_d);
+ SYM_PICKER_RES_ID.put('e', com.android.internal.R.string.symbol_picker_e);
+ SYM_PICKER_RES_ID.put('g', com.android.internal.R.string.symbol_picker_g);
+ SYM_PICKER_RES_ID.put('i', com.android.internal.R.string.symbol_picker_i);
+ SYM_PICKER_RES_ID.put('l', com.android.internal.R.string.symbol_picker_l);
+ SYM_PICKER_RES_ID.put('n', com.android.internal.R.string.symbol_picker_n);
+ SYM_PICKER_RES_ID.put('o', com.android.internal.R.string.symbol_picker_o);
+ SYM_PICKER_RES_ID.put('r', com.android.internal.R.string.symbol_picker_r);
+ SYM_PICKER_RES_ID.put('s', com.android.internal.R.string.symbol_picker_s);
+ SYM_PICKER_RES_ID.put('t', com.android.internal.R.string.symbol_picker_t);
+ SYM_PICKER_RES_ID.put('u', com.android.internal.R.string.symbol_picker_u);
+ SYM_PICKER_RES_ID.put('y', com.android.internal.R.string.symbol_picker_y);
+ SYM_PICKER_RES_ID.put('z', com.android.internal.R.string.symbol_picker_z);
+ SYM_PICKER_RES_ID.put('1', com.android.internal.R.string.symbol_picker_1);
+ SYM_PICKER_RES_ID.put('2', com.android.internal.R.string.symbol_picker_2);
+ SYM_PICKER_RES_ID.put('3', com.android.internal.R.string.symbol_picker_3);
+ SYM_PICKER_RES_ID.put('4', com.android.internal.R.string.symbol_picker_4);
+ SYM_PICKER_RES_ID.put('5', com.android.internal.R.string.symbol_picker_5);
+ SYM_PICKER_RES_ID.put('7', com.android.internal.R.string.symbol_picker_7);
+ SYM_PICKER_RES_ID.put('0', com.android.internal.R.string.symbol_picker_0);
+ SYM_PICKER_RES_ID.put(KeyCharacterMap.PICKER_DIALOG_INPUT,com.android.internal.R.string.symbol_picker_sym);
+ SYM_PICKER_RES_ID.put('/', com.android.internal.R.string.symbol_picker_slash);
+ SYM_PICKER_RES_ID.put('$', com.android.internal.R.string.symbol_picker_dollar);
+ SYM_PICKER_RES_ID.put('%', com.android.internal.R.string.symbol_picker_percent);
+ SYM_PICKER_RES_ID.put('*', com.android.internal.R.string.symbol_picker_star);
+ SYM_PICKER_RES_ID.put('-', com.android.internal.R.string.symbol_picker_minus);
+ SYM_PICKER_RES_ID.put('+', com.android.internal.R.string.symbol_picker_plus);
+ SYM_PICKER_RES_ID.put('(', com.android.internal.R.string.symbol_picker_opening_parenthesis);
+ SYM_PICKER_RES_ID.put(')', com.android.internal.R.string.symbol_picker_closing_parenthesis);
+ SYM_PICKER_RES_ID.put('!', com.android.internal.R.string.symbol_picker_exclamation);
+ SYM_PICKER_RES_ID.put('"', com.android.internal.R.string.symbol_picker_quote);
+ SYM_PICKER_RES_ID.put('?', com.android.internal.R.string.symbol_picker_question);
+ SYM_PICKER_RES_ID.put(',', com.android.internal.R.string.symbol_picker_comma);
+ SYM_PICKER_RES_ID.put('=', com.android.internal.R.string.symbol_picker_equal);
+ SYM_PICKER_RES_ID.put('<', com.android.internal.R.string.symbol_picker_lt);
+ SYM_PICKER_RES_ID.put('>', com.android.internal.R.string.symbol_picker_gt);
};
private boolean showCharacterPicker(View view, Editable content, char c,
boolean insert, int count) {
- String set = PICKER_SETS.get(c);
- if (set == null) {
+ Integer resId = SYM_PICKER_RES_ID.get(c);
+
+ if (resId == null) {
return false;
}
+ String set = view.getContext().getString(resId);
+
if (count == 1) {
new CharacterPickerDialog(view.getContext(),
view, content, set, insert).show();
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 a337d14..c656bec 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -835,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..16d7d08 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 -->
@@ -3511,4 +3515,59 @@
<string name="weather_tap_to_refresh">Tap to refresh</string>
<string name="weather_refreshing">Refreshing</string>
+ <!-- Options that show upon long-pressing a key on the physical keyboard -->
+ <string name="symbol_picker_A">\u00C0\u00C1\u00C2\u00C4\u00C6\u00C3\u00C5\u0104\u0100</string>
+ <string name="symbol_picker_C">\u00C7\u0106\u010C</string>
+ <string name="symbol_picker_D">\u010E</string>
+ <string name="symbol_picker_E">\u00C8\u00C9\u00CA\u00CB\u0118\u011A\u0112</string>
+ <string name="symbol_picker_G">\u011E</string>
+ <string name="symbol_picker_L">\u0141</string>
+ <string name="symbol_picker_I">\u00CC\u00CD\u00CE\u00CF\u012A\u0130</string>
+ <string name="symbol_picker_N">\u00D1\u0143\u0147</string>
+ <string name="symbol_picker_O">\u00D8\u0152\u00D5\u00D2\u00D3\u00D4\u00D6\u014C</string>
+ <string name="symbol_picker_R">\u0158</string>
+ <string name="symbol_picker_S">\u015A\u0160\u015E</string>
+ <string name="symbol_picker_T">\u0164</string>
+ <string name="symbol_picker_U">\u00D9\u00DA\u00DB\u00DC\u016E\u016A</string>
+ <string name="symbol_picker_Y">\u00DD\u0178</string>
+ <string name="symbol_picker_Z">\u0179\u017B\u017D</string>
+ <string name="symbol_picker_a">\u00E0\u00E1\u00E2\u00E4\u00E6\u00E3\u00E5\u0105\u0101</string>
+ <string name="symbol_picker_c">\u00E7\u0107\u010D</string>
+ <string name="symbol_picker_d">\u010F</string>
+ <string name="symbol_picker_e">\u00E8\u00E9\u00EA\u00EB\u0119\u011B\u0113</string>
+ <string name="symbol_picker_g">\u011F</string>
+ <string name="symbol_picker_i">\u00EC\u00ED\u00EE\u00EF\u012B\u0131</string>
+ <string name="symbol_picker_l">\u0142</string>
+ <string name="symbol_picker_n">\u00F1\u0144\u0148</string>
+ <string name="symbol_picker_o">\u00F8\u0153\u00F5\u00F2\u00F3\u00F4\u00F6\u014D</string>
+ <string name="symbol_picker_r">\u0159</string>
+ <string name="symbol_picker_s">\u00A7\u00DF\u015B\u0161\u015F</string>
+ <string name="symbol_picker_t">\u0165</string>
+ <string name="symbol_picker_u">\u00F9\u00FA\u00FB\u00FC\u016F\u016B</string>
+ <string name="symbol_picker_y">\u00FD\u00FF</string>
+ <string name="symbol_picker_z">\u017A\u017C\u017E</string>
+ <string name="symbol_picker_sym">\u2026\u00A5\u2022\u00AE\u00A9\u00B1[]{}\u003C>`^\\|</string>
+ <string name="symbol_picker_slash">\\</string>
+ <string name="symbol_picker_1">\u00b9\u00bd\u2153\u00bc\u215b</string>
+ <string name="symbol_picker_2">\u00b2\u2154</string>
+ <string name="symbol_picker_3">\u00b3\u00be\u215c</string>
+ <string name="symbol_picker_4">\u2074</string>
+ <string name="symbol_picker_5">\u215d</string>
+ <string name="symbol_picker_7">\u215e</string>
+ <string name="symbol_picker_0">\u207f\u2205</string>
+ <string name="symbol_picker_dollar">\u00a2\u00a3\u20ac\u00a5\u20a3\u20a4\u20b1</string>
+ <string name="symbol_picker_percent">\u2030</string>
+ <string name="symbol_picker_star">\u2020\u2021</string>
+ <string name="symbol_picker_minus">\u2013\u2014</string>
+ <string name="symbol_picker_plus">\u00b1</string>
+ <string name="symbol_picker_opening_parenthesis">[{\u003C</string>
+ <string name="symbol_picker_closing_parenthesis">]}></string>
+ <string name="symbol_picker_exclamation">\u00a1</string>
+ <string name="symbol_picker_quote">\u201c\u201d\u00ab\u00bb\u02dd</string>
+ <string name="symbol_picker_question">\u00bf</string>
+ <string name="symbol_picker_comma">\u201a\u201e</string>
+ <string name="symbol_picker_equal">\u2260\u2248\u221e</string>
+ <string name="symbol_picker_lt">\u2264\u00ab\u2039</string>
+ <string name="symbol_picker_gt">\u2265\u00bb\u203a</string>
+
</resources>
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/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/packages/SystemUI/res/layout-sw600dp/status_bar_settings_button.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_settings_button.xml
new file mode 100644
index 0000000..ebf0102
--- /dev/null
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_settings_button.xml
@@ -0,0 +1,15 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/StatusBarPanelSettingsRow">
+
+ <ImageView
+ style="@style/StatusBarPanelSettingsIcon"/>
+
+ <TextView
+ style="@style/StatusBarPanelSettingsContents"/>
+
+ <Switch android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="5dp"/>
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml
index b315432..45152a0 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_settings_view.xml
@@ -18,165 +18,18 @@
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
android:layout_height="match_parent"
android:layout_width="match_parent">
<com.android.systemui.statusbar.tablet.SettingsView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
- <!-- Toggle 1 -->
- <LinearLayout
- android:id="@+id/toggle_1"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_1_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/ic_sysbar_airplane_on"
- />
- <TextView
- android:id="@+id/toggle_1_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_airplane"
- />
- <Switch
- android:id="@+id/toggle_1_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
- <View style="@style/StatusBarPanelSettingsPanelSeparator" />
-
- <!-- Toggle 2 -->
- <LinearLayout
- android:id="@+id/toggle_2"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_2_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/ic_sysbar_wifi_on"
- />
- <TextView
- android:id="@+id/toggle_2_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_wifi_button"
- />
- <Switch
- android:id="@+id/toggle_2_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
- <View style="@style/StatusBarPanelSettingsPanelSeparator" />
-
- <!-- Toggle 3 -->
- <LinearLayout
- android:id="@+id/toggle_3"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_3_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/stat_sys_data_bluetooth"
- />
- <TextView
- android:id="@+id/toggle_3_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_bluetooth_button"
- />
- <Switch
- android:id="@+id/toggle_3_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
- <View style="@style/StatusBarPanelSettingsPanelSeparator" />
+ <!-- Power widget buttons will be added here -->
- <!-- Toggle 4 -->
- <LinearLayout
- android:id="@+id/toggle_4"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_4_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/ic_sysbar_rotate_on"
- />
- <TextView
- android:id="@+id/toggle_4_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_auto_rotation"
- />
- <Switch
- android:id="@+id/toggle_4_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
- <View style="@style/StatusBarPanelSettingsPanelSeparator" />
-
- <!-- Toggle 5 -->
- <LinearLayout
- android:id="@+id/toggle_5"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_5_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/stat_gps_on"
- />
- <TextView
- android:id="@+id/toggle_5_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_location"
- />
- <Switch
- android:id="@+id/toggle_5_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
- <View style="@style/StatusBarPanelSettingsPanelSeparator" />
-
- <!-- Toggle 6 -->
- <LinearLayout
- android:id="@+id/toggle_6"
- style="@style/StatusBarPanelSettingsRow"
- >
- <ImageView
- android:id="@+id/toggle_6_icon"
- style="@style/StatusBarPanelSettingsIcon"
- android:src="@drawable/stat_flashlight_on"
- />
- <TextView
- android:id="@+id/toggle_6_label"
- style="@style/StatusBarPanelSettingsContents"
- android:text="@string/status_bar_settings_flashlight"
- />
- <Switch
- android:id="@+id/toggle_6_checkbox"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginRight="5dp"
- />
- </LinearLayout>
<View style="@style/StatusBarPanelSettingsPanelSeparator" />
<!-- Brightness -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 51bd0cf..2b0fdba 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -95,5 +95,28 @@
<!-- Note: must be dp to fit in status bar -->
<item name="android:textSize">14dp</item>
</style>
+
+ <style name="StatusBarPanelSettingsIcon">
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:layout_width">64dp</item>
+ <item name="android:scaleType">center</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsRow">
+ <item name="android:paddingRight">16dp</item>
+ <item name="android:layout_height">64dp</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:background">?android:attr/listChoiceBackgroundIndicator</item>
+ </style>
+
+ <style name="StatusBarPanelSettingsContents">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_gravity">left|center_vertical</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textSize">18sp</item>
+ </style>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java
index d0f9449..0432ffa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java
@@ -31,6 +31,8 @@ import android.widget.LinearLayout;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
+import android.widget.Switch;
+import android.view.LayoutInflater;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.AirplaneModeController;
@@ -51,7 +53,6 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
static final String TAG = "SettingsView";
private static final String NO_TOGGLES = "no_toggles";
- private static final int[] TOGGLE_ID_ARRAY = new int[6];
private static final int AIRPLANE_ID = 0;
private static final int ROTATE_ID = 1;
private static final int BLUETOOTH_ID = 2;
@@ -62,15 +63,6 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
private static final int NETWORK_MODE_ID = 7;
private static final int SOUND_ID = 8;
- private static final int[] mToggleIds = new int[]{
- R.id.toggle_1, R.id.toggle_2, R.id.toggle_3, R.id.toggle_4, R.id.toggle_5, R.id.toggle_6};
- private static final int[] mToggleIcons = new int[]{
- R.id.toggle_1_icon, R.id.toggle_2_icon, R.id.toggle_3_icon, R.id.toggle_4_icon, R.id.toggle_5_icon, R.id.toggle_6_icon};
- private static final int[] mToggleLabels = new int[]{
- R.id.toggle_1_label, R.id.toggle_2_label, R.id.toggle_3_label, R.id.toggle_4_label, R.id.toggle_5_label, R.id.toggle_6_label};
- private static final int[] mToggleCheckBoxes = new int[]{
- R.id.toggle_1_checkbox, R.id.toggle_2_checkbox, R.id.toggle_3_checkbox, R.id.toggle_4_checkbox, R.id.toggle_5_checkbox, R.id.toggle_6_checkbox};
-
private static final String[] KEY_TOGGLES = new String[]{"pref_airplane_toggle", "pref_rotate_toggle", "pref_bluetooth_toggle", "pref_gps_toggle", "pref_wifi_toggle", "pref_flashlight_toggle", "pref_mobile_data_toggle", "pref_network_mode_toggle", "pref_sound_toggle"};
private static final String BUTTON_DELIMITER = "\\|";
@@ -118,6 +110,13 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
}
}
+ private class ButtonTag {
+ public int toggleId;
+ public ButtonTag(int id) {
+ toggleId = id;
+ }
+ }
+
public SettingsView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -141,33 +140,46 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
mToggleContainer = BUTTONS_DEFAULT;
if(!mToggleContainer.equals(NO_TOGGLES)){
updateToggles();
-
- int mLastVisible = mToggles.length;
- for(int i=0; i<mToggleIds.length; i++){
- if(i<mLastVisible)
- findViewById(mToggleIds[i]).setOnClickListener(this);
- else
- findViewById(mToggleIds[i]).setVisibility(View.GONE);
- }
- } else {
- for(int i=0; i<mToggleIds.length; i++){
- findViewById(mToggleIds[i]).setVisibility(View.GONE);
- }
}
findViewById(R.id.settings).setOnClickListener(this);
}
- private void updateToggles(){
+ private void clearToggles() {
+ for (int i = getChildCount() - 1; i >= 0; i--) {
+ View v = getChildAt(i);
+ if (v.getTag() instanceof ButtonTag)
+ removeView(v);
+ }
+ }
+
+ private void updateToggles(){
+ clearToggleControllers();
+ clearToggles();
mToggles = mToggleContainer.split("\\|");
- for(int i=0; i<mToggles.length; i++){
+ for(int i=mToggles.length - 1; i>=0; i--){
String mToggleName = mToggles[i].replace("\\", "");
int[] resources = getResourcesById(mToggleName);
- setToggleResources(mToggleIds[i], mToggleIcons[i], mToggleLabels[i], resources[0], resources[1]);
- TOGGLE_ID_ARRAY[i] = resources[2];
- setToggleController(mToggleName, mToggleCheckBoxes[i]);
+ addToggle(resources, mToggleName);
}
}
+ private void addToggle(final int[] res, String name) {
+ LinearLayout toggle = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.status_bar_settings_button, this, false);
+ addView(toggle,0);
+
+ ImageView icon = (ImageView)toggle.getChildAt(0);
+ icon.setImageResource(res[0]);
+ TextView label = (TextView)toggle.getChildAt(1);
+ label.setText(res[1]);
+ Switch checkbox = (Switch)toggle.getChildAt(2);
+
+ toggle.setTag(new ButtonTag(res[2]));
+ toggle.setOnClickListener(this);
+
+ setToggleController(name, (CompoundButton)checkbox);
+ }
+
+
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
@@ -180,25 +192,38 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
mDoNotDisturb.release();
}
- private void setToggleController(String id, int mCheckbox){
+
+ private void clearToggleControllers() {
+ mAirplane = null;
+ mRotate = null;
+ mBluetooth = null;
+ mFlashLight = null;
+ mGps = null;
+ mMobileData = null;
+ mNetworkMode = null;
+ mSound = null;
+ mWifi = null;
+ }
+
+ private void setToggleController(String id, CompoundButton checkbox) {
if(id.equals(KEY_TOGGLES[0]))
- mAirplane = new AirplaneModeController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mAirplane = new AirplaneModeController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[1]))
- mRotate = new AutoRotateController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mRotate = new AutoRotateController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[2]))
- mBluetooth = new BluetoothController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mBluetooth = new BluetoothController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[3]))
- mGps = new LocationController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mGps = new LocationController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[4]))
- mWifi = new WifiController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mWifi = new WifiController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[5]))
- mFlashLight = new FlashlightController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mFlashLight = new FlashlightController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[6]))
- mMobileData = new MobileDataController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mMobileData = new MobileDataController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[7]))
- mNetworkMode = new NetworkModeController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mNetworkMode = new NetworkModeController(mContext, checkbox);
else if(id.equals(KEY_TOGGLES[8]))
- mSound = new SoundController(mContext, (CompoundButton)findViewById(mCheckbox));
+ mSound = new SoundController(mContext, checkbox);
}
private int[] getResourcesById(String id){
@@ -224,41 +249,17 @@ public class SettingsView extends LinearLayout implements View.OnClickListener {
return new int[]{0, 0};
}
- private void setToggleResources(int resourceId, int resourceIcon, int resourceLabel, int newResourceIcon, int newResourceLabel){
- LinearLayout mToggle = (LinearLayout) findViewById(resourceId);
- ImageView mToggleImageView = (ImageView) mToggle.findViewById(resourceIcon);
- mToggleImageView.setImageResource(newResourceIcon);
- TextView mToggleTextView = (TextView) mToggle.findViewById(resourceLabel);
- mToggleTextView.setText(newResourceLabel);
- }
-
private StatusBarManager getStatusBarManager() {
return (StatusBarManager)getContext().getSystemService(Context.STATUS_BAR_SERVICE);
}
public void onClick(View v) {
- switch (v.getId()) {
- case R.id.toggle_1:
- onClickToggle(TOGGLE_ID_ARRAY[0]);
- break;
- case R.id.toggle_2:
- onClickToggle(TOGGLE_ID_ARRAY[1]);
- break;
- case R.id.toggle_3:
- onClickToggle(TOGGLE_ID_ARRAY[2]);
- break;
- case R.id.toggle_4:
- onClickToggle(TOGGLE_ID_ARRAY[3]);
- break;
- case R.id.toggle_5:
- onClickToggle(TOGGLE_ID_ARRAY[4]);
- break;
- case R.id.toggle_6:
- onClickToggle(TOGGLE_ID_ARRAY[5]);
- break;
- case R.id.settings:
- onClickSettings();
- break;
+ if (v.getId() == R.id.settings) {
+ onClickSettings();
+ } else {
+ Object tag = v.getTag();
+ if (tag instanceof ButtonTag)
+ onClickToggle(((ButtonTag) tag).toggleId);
}
}
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/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 dc0d30f..4226a7e 100644
--- a/telephony/java/com/android/internal/telephony/Smdk4210RIL.java
+++ b/telephony/java/com/android/internal/telephony/Smdk4210RIL.java
@@ -118,7 +118,7 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
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_SEND_SMS_RESULT = 11002;
static final int RIL_UNSOL_STK_CALL_CONTROL_RESULT = 11003;
static final int RIL_UNSOL_DUN_CALL_STATUS = 11004;
@@ -151,9 +151,11 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
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
@@ -501,6 +503,8 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
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:
@@ -534,63 +538,52 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
case RIL_UNSOL_AM:
case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL:
case RIL_UNSOL_DATA_SUSPEND_RESUME:
- if (RILJ_LOGD) unsljLogRet(response, ret);
+ 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:
- unsljLogRet(response, ret);
+ if (RILJ_LOGD) samsungUnsljLogRet(response, ret);
setWbAmr(((int[])ret)[0]);
break;
}
}
static String
- responseToString(int request)
+ samsungResponseToString(int request)
{
switch(request) {
- case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
- case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
- case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
- case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
- case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
- case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
- case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
- case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST";
- case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
- case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
- case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
- case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION";
- case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
- case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
- case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
- case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
- case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FULL";
- case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
- case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
- case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
- case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_RESPONSE_CDMA_NEW_SMS";
- case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
- case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
- case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
- case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
- case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
- case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
- case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
- case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
- case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
- case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
- case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "CDMA_SUBSCRIPTION_SOURCE_CHANGED";
- 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";
// 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.
*
@@ -610,7 +603,6 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
* @param state: 0 = unsupported, 1 = supported.
*/
private void setWbAmr(int state) {
- AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
if (state == 1) {
Log.d(LOG_TAG, "setWbAmr(): setting audio parameter - wb_amr=on");
audioManager.setParameters("wb_amr=on");
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/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 21167a9..8e31e5a 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -1356,8 +1356,10 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
// As a special extension, the Android emulator appends the name of
// the host computer's timezone to the nitz string. this is zoneinfo
// timezone name of the form Area!Location or Area!Location!SubLocation
- // so we need to convert the ! into /
- if (nitzSubs.length >= 9) {
+ // so we need to convert the ! into /. If there's no "!", then maybe
+ // the carrier is appending something extra (as AT&T does) and it
+ // should be ignored
+ if ((nitzSubs.length >= 9) && (nitzSubs[8].indexOf('!') != -1)) {
String tzname = nitzSubs[8].replace('!','/');
zone = TimeZone.getTimeZone( tzname );
}
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) {
+ }
}