diff options
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) { + } } |