diff options
38 files changed, 1453 insertions, 130 deletions
diff --git a/api/current.xml b/api/current.xml index 4df50bc7cfc3..b17cbe7955c3 100644 --- a/api/current.xml +++ b/api/current.xml @@ -113269,6 +113269,746 @@ > </field> </class> +<class name="SmsManager" + extends="java.lang.Object" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="divideMessage" + return="java.util.ArrayList<java.lang.String>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="text" type="java.lang.String"> +</parameter> +</method> +<method name="getDefault" + return="android.telephony.SmsManager" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="sendDataMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationPort" type="short"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<parameter name="sentIntent" type="android.app.PendingIntent"> +</parameter> +<parameter name="deliveryIntent" type="android.app.PendingIntent"> +</parameter> +</method> +<method name="sendMultipartTextMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="parts" type="java.util.ArrayList<java.lang.String>"> +</parameter> +<parameter name="sentIntents" type="java.util.ArrayList<android.app.PendingIntent>"> +</parameter> +<parameter name="deliveryIntents" type="java.util.ArrayList<android.app.PendingIntent>"> +</parameter> +</method> +<method name="sendTextMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="text" type="java.lang.String"> +</parameter> +<parameter name="sentIntent" type="android.app.PendingIntent"> +</parameter> +<parameter name="deliveryIntent" type="android.app.PendingIntent"> +</parameter> +</method> +<field name="RESULT_ERROR_GENERIC_FAILURE" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_NO_SERVICE" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_NULL_PDU" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="RESULT_ERROR_RADIO_OFF" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_FREE" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_READ" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_SENT" + type="int" + transient="false" + volatile="false" + value="5" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_UNREAD" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="STATUS_ON_ICC_UNSENT" + type="int" + transient="false" + volatile="false" + value="7" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="SmsMessage" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="calculateLength" + return="int[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="msgBody" type="java.lang.CharSequence"> +</parameter> +<parameter name="use7bitOnly" type="boolean"> +</parameter> +</method> +<method name="calculateLength" + return="int[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="messageBody" type="java.lang.String"> +</parameter> +<parameter name="use7bitOnly" type="boolean"> +</parameter> +</method> +<method name="createFromPdu" + return="android.telephony.SmsMessage" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pdu" type="byte[]"> +</parameter> +</method> +<method name="getDisplayMessageBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getDisplayOriginatingAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getEmailBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getEmailFrom" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getIndexOnIcc" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getIndexOnSim" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +</method> +<method name="getMessageBody" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getMessageClass" + return="android.telephony.SmsMessage.MessageClass" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getOriginatingAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getPdu" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getProtocolIdentifier" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getPseudoSubject" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getServiceCenterAddress" + return="java.lang.String" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatus" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatusOnIcc" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStatusOnSim" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="deprecated" + visibility="public" +> +</method> +<method name="getSubmitPdu" + return="android.telephony.SmsMessage.SubmitPdu" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="message" type="java.lang.String"> +</parameter> +<parameter name="statusReportRequested" type="boolean"> +</parameter> +</method> +<method name="getSubmitPdu" + return="android.telephony.SmsMessage.SubmitPdu" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="scAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationAddress" type="java.lang.String"> +</parameter> +<parameter name="destinationPort" type="short"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<parameter name="statusReportRequested" type="boolean"> +</parameter> +</method> +<method name="getTPLayerLengthForPDU" + return="int" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pdu" type="java.lang.String"> +</parameter> +</method> +<method name="getTimestampMillis" + return="long" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getUserData" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isCphsMwiMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isEmail" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMWIClearMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMWISetMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isMwiDontStore" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isReplace" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isReplyPathPresent" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isStatusReportMessage" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<field name="ENCODING_16BIT" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_7BIT" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_8BIT" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ENCODING_UNKNOWN" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_BYTES" + type="int" + transient="false" + volatile="false" + value="140" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_BYTES_WITH_HEADER" + type="int" + transient="false" + volatile="false" + value="134" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_SEPTETS" + type="int" + transient="false" + volatile="false" + value="160" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="MAX_USER_DATA_SEPTETS_WITH_HEADER" + type="int" + transient="false" + volatile="false" + value="153" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="SmsMessage.MessageClass" + extends="java.lang.Enum" + abstract="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="valueOf" + return="android.telephony.SmsMessage.MessageClass" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="name" type="java.lang.String"> +</parameter> +</method> +<method name="values" + return="android.telephony.SmsMessage.MessageClass[]" + abstract="false" + native="false" + synchronized="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</method> +</class> +<class name="SmsMessage.SubmitPdu" + extends="java.lang.Object" + abstract="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<field name="encodedMessage" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="encodedScAddress" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> <class name="TelephonyManager" extends="java.lang.Object" abstract="false" diff --git a/cmds/keystore/keymgmt.c b/cmds/keystore/keymgmt.c index c45b53caac70..9a1f8457d224 100644 --- a/cmds/keystore/keymgmt.c +++ b/cmds/keystore/keymgmt.c @@ -228,6 +228,11 @@ int remove_key(const char *namespace, const char *keyname) char keyfile[KEYFILE_LEN]; if (state != UNLOCKED) return -state; + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { + LOGE("keyname is too long."); + return -1; + } sprintf(keyfile, KEYFILE_NAME, namespace, keyname); return unlink(keyfile); } @@ -243,12 +248,12 @@ int put_key(const char *namespace, const char *keyname, LOGE("Can not store key with current state %d\n", state); return -state; } - sprintf(keyfile, KEYFILE_NAME, namespace, keyname); - // flatten the args - if (strlen(keyname) >= MAX_KEY_NAME_LENGTH) { + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { LOGE("keyname is too long."); return -1; } + sprintf(keyfile, KEYFILE_NAME, namespace, keyname); strcpy(blob.keyname, keyname); blob.value_size = size; if (size > MAX_KEY_VALUE_LENGTH) { @@ -271,6 +276,11 @@ int get_key(const char *namespace, const char *keyname, LOGE("Can not retrieve key value with current state %d\n", state); return -state; } + if ((strlen(namespace) >= MAX_KEY_NAME_LENGTH) || + (strlen(keyname) >= MAX_KEY_NAME_LENGTH)) { + LOGE("keyname is too long."); + return -1; + } sprintf(keyfile, KEYFILE_NAME, namespace, keyname); ret = load_n_decrypt(keyname, keyfile, &decryptKey, &blob); if (!ret) { @@ -299,6 +309,13 @@ int list_keys(const char *namespace, char reply[BUFFER_MAX]) LOGE("cannot open keystore dir or namespace is null\n"); return -1; } + + if (strlen(namespace) >= MAX_KEY_NAME_LENGTH) { + LOGE("namespace is too long."); + return -1; + } + + reply[0] = 0; while ((de = readdir(d))) { char *prefix, *name, *keyfile = de->d_name; char *context = NULL; @@ -367,6 +384,7 @@ KEYSTORE_STATE get_state() int reset_keystore() { + int ret = 0; DIR *d; struct dirent *de; @@ -374,18 +392,24 @@ int reset_keystore() LOGE("cannot open keystore dir\n"); return -1; } - while ((de = readdir(d))) unlink(de->d_name); + while ((de = readdir(d))) { + if (unlink(de->d_name) != 0) ret = -1; + } closedir(d); state = UNINITIALIZED; - LOGI("keystore is reset."); - return 0; + if (ret == 0) { + LOGI("keystore is reset."); + } else { + LOGI("keystore can not be cleaned up entirely."); + } + return ret; } int init_keystore(const char *dir) { int fd; - if (!dir) mkdir(dir, 0770); + if (dir) mkdir(dir, 0770); if (!dir || chdir(dir)) { LOGE("Can not open/create the keystore directory %s\n", dir ? dir : "(null)"); diff --git a/cmds/keystore/tests/Android.mk b/cmds/keystore/tests/Android.mk new file mode 100644 index 000000000000..33541cc79f19 --- /dev/null +++ b/cmds/keystore/tests/Android.mk @@ -0,0 +1,28 @@ +# Copyright (C) 2009 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. +# +# define the KEYSTORE_TESTS environment variable to build the test programs +ifdef KEYSTORE_TESTS +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) +LOCAL_SRC_FILES:= netkeystore_test.c ../keymgmt.c +LOCAL_SHARED_LIBRARIES := libcutils libssl +LOCAL_MODULE:= netkeystore_test +LOCAL_MODULE_TAGS := optional +LOCAL_C_INCLUDES := external/openssl/include \ + frameworks/base/cmds/keystore +EXTRA_CFLAGS := -g -O0 -DGTEST_OS_LINUX -DGTEST_HAS_STD_STRING +include $(BUILD_EXECUTABLE) + +endif #KEYSTORE_TESTS diff --git a/cmds/keystore/tests/netkeystore_test.c b/cmds/keystore/tests/netkeystore_test.c new file mode 100644 index 000000000000..e7e686bd4368 --- /dev/null +++ b/cmds/keystore/tests/netkeystore_test.c @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "common.h" +#include "keymgmt.h" + +typedef int FUNC_PTR(); +typedef struct { + const char *name; + FUNC_PTR *func; +} TESTFUNC; + +#define FUNC_NAME(x) { #x, test_##x } +#define FUNC_BODY(x) int test_##x() + +#define TEST_PASSWD "12345678" +#define TEST_NPASSWD "11111111" +#define TEST_DIR "/data/local/tmp/keystore" +#define READONLY_DIR "/proc/keystore" +#define TEST_NAMESPACE "test" +#define TEST_KEYNAME "key" +#define TEST_KEYNAME2 "key2" +#define TEST_KEYVALUE "ANDROID" + +void setup() +{ + if (init_keystore(TEST_DIR) != 0) { + fprintf(stderr, "Can not create the test directory %s\n", TEST_DIR); + exit(-1); + } +} + +void teardown() +{ + reset_keystore(); + rmdir(TEST_DIR); +} + +FUNC_BODY(init_keystore) +{ + if (init_keystore(READONLY_DIR) == 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(reset_keystore) +{ + chdir("/procx"); + if (reset_keystore() == 0) return -1; + chdir(TEST_DIR); + return EXIT_SUCCESS; +} + +FUNC_BODY(get_state) +{ + if (get_state() != UNINITIALIZED) return -1; + passwd(TEST_PASSWD); + if (get_state() != UNLOCKED) return -1; + lock(); + if (get_state() != LOCKED) return -1; + reset_keystore(); + if (get_state() != UNINITIALIZED) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(passwd) +{ + char buf[512]; + + if (passwd(" 23432dsfsdf") == 0) return -1; + if (passwd("dsfsdf") == 0) return -1; + passwd(TEST_PASSWD); + lock(); + if (unlock("55555555") == 0) return -1; + if (unlock(TEST_PASSWD) != 0) return -1; + + // change the password + sprintf(buf, "%s %s", "klfdjdsklfjg", "abcdefghi"); + if (passwd(buf) == 0) return -1; + + sprintf(buf, "%s %s", TEST_PASSWD, TEST_NPASSWD); + if (passwd(buf) != 0) return -1; + lock(); + + if (unlock(TEST_PASSWD) == 0) return -1; + if (unlock(TEST_NPASSWD) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(lock) +{ + if (lock() == 0) return -1; + passwd(TEST_PASSWD); + if (lock() != 0) return -1; + if (lock() != 0) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(unlock) +{ + int i = MAX_RETRY_COUNT; + passwd(TEST_PASSWD); + lock(); + while (i > 1) { + if (unlock(TEST_NPASSWD) != --i) return -1; + } + if (unlock(TEST_NPASSWD) != -1) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(put_key) +{ + int i = 0; + char keyname[512]; + + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) == 0) return -1; + passwd(TEST_PASSWD); + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) != 0) return -1; + + for(i = 0; i < 500; i++) keyname[i] = 'K'; + keyname[i] = 0; + if (put_key(TEST_NAMESPACE, keyname, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)) == 0) return -1; + if (put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + MAX_KEY_VALUE_LENGTH + 1) == 0) return -1; + return EXIT_SUCCESS; +} + +FUNC_BODY(get_key) +{ + int size; + unsigned char data[MAX_KEY_VALUE_LENGTH]; + + if (get_key(TEST_NAMESPACE, TEST_KEYNAME, data, &size) == 0) return -1; + + passwd(TEST_PASSWD); + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (get_key(TEST_NAMESPACE, TEST_KEYNAME, data, &size) != 0) return -1; + if (memcmp(data, TEST_KEYVALUE, size) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(remove_key) +{ + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) == 0) return -1; + + passwd(TEST_PASSWD); + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) == 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (remove_key(TEST_NAMESPACE, TEST_KEYNAME) != 0) return -1; + + return EXIT_SUCCESS; +} + +FUNC_BODY(list_keys) +{ + int i; + char buf[128]; + char reply[BUFFER_MAX]; + + for(i = 0; i < 100; i++) buf[i] = 'K'; + buf[i] = 0; + + if (list_keys(TEST_NAMESPACE, reply) == 0) return -1; + + passwd(TEST_PASSWD); + if (list_keys(buf, reply) == 0) return -1; + + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + if (strcmp(reply, "") != 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + if (strcmp(reply, TEST_KEYNAME) != 0) return -1; + + put_key(TEST_NAMESPACE, TEST_KEYNAME2, (unsigned char *)TEST_KEYVALUE, + strlen(TEST_KEYVALUE)); + + if (list_keys(TEST_NAMESPACE, reply) != 0) return -1; + sprintf(buf, "%s %s", TEST_KEYNAME2, TEST_KEYNAME); + if (strcmp(reply, buf) != 0) return -1; + + return EXIT_SUCCESS; +} + +TESTFUNC all_tests[] = { + FUNC_NAME(init_keystore), + FUNC_NAME(reset_keystore), + FUNC_NAME(get_state), + FUNC_NAME(passwd), + FUNC_NAME(lock), + FUNC_NAME(unlock), + FUNC_NAME(put_key), + FUNC_NAME(get_key), + FUNC_NAME(remove_key), + FUNC_NAME(list_keys), +}; + +int main(int argc, char **argv) { + int i, ret; + for (i = 0 ; i < (int)(sizeof(all_tests)/sizeof(TESTFUNC)) ; ++i) { + setup(); + if ((ret = all_tests[i].func()) != EXIT_SUCCESS) { + fprintf(stderr, "ERROR in function %s\n", all_tests[i].name); + return ret; + } else { + fprintf(stderr, "function %s PASSED!\n", all_tests[i].name); + } + teardown(); + } + return EXIT_SUCCESS; +} diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index 4dd2433e20c4..18e4a528ec46 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -903,6 +903,12 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS getContext().startActivity(mVoiceWebSearchIntent); } else if (mSearchable.getVoiceSearchLaunchRecognizer()) { Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent); + + // Stop the existing search before starting voice search, or else we'll end + // up showing the search dialog again once we return to the app. + ((SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE)). + stopSearch(); + getContext().startActivity(appSearchIntent); } } catch (ActivityNotFoundException e) { @@ -1238,11 +1244,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // ensure the icons will work for global search cv.put(SearchManager.SUGGEST_COLUMN_ICON_1, wrapIconForPackage( - source, + mSearchable.getSuggestPackage(), getColumnString(c, SearchManager.SUGGEST_COLUMN_ICON_1))); cv.put(SearchManager.SUGGEST_COLUMN_ICON_2, wrapIconForPackage( - source, + mSearchable.getSuggestPackage(), getColumnString(c, SearchManager.SUGGEST_COLUMN_ICON_2))); // the rest can be passed through directly @@ -1281,11 +1287,11 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS * Wraps an icon for a particular package. If the icon is a resource id, it is converted into * an android.resource:// URI. * - * @param source The source of the icon + * @param packageName The source of the icon * @param icon The icon retrieved from a suggestion column * @return An icon string appropriate for the package. */ - private String wrapIconForPackage(ComponentName source, String icon) { + private String wrapIconForPackage(String packageName, String icon) { if (icon == null || icon.length() == 0 || "0".equals(icon)) { // SearchManager specifies that null or zero can be returned to indicate // no icon. We also allow empty string. @@ -1293,7 +1299,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS } else if (!Character.isDigit(icon.charAt(0))){ return icon; } else { - String packageName = source.getPackageName(); return new Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .authority(packageName) diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index 5c7b01fa0ccb..8ebe0932c214 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -637,12 +637,13 @@ public final class AssetManager { * mRetData. */ private native final int loadResourceBagValue(int ident, int bagEntryId, TypedValue outValue, boolean resolve); - /*package*/ static final int STYLE_NUM_ENTRIES = 5; + /*package*/ static final int STYLE_NUM_ENTRIES = 6; /*package*/ static final int STYLE_TYPE = 0; /*package*/ static final int STYLE_DATA = 1; /*package*/ static final int STYLE_ASSET_COOKIE = 2; /*package*/ static final int STYLE_RESOURCE_ID = 3; /*package*/ static final int STYLE_CHANGING_CONFIGURATIONS = 4; + /*package*/ static final int STYLE_DENSITY = 5; /*package*/ native static final boolean applyStyle(int theme, int defStyleAttr, int defStyleRes, int xmlParser, int[] inAttrs, int[] outValues, int[] outIndices); diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 3a32c0312202..016ee7f4c7df 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -654,6 +654,7 @@ public class TypedArray { outValue.assetCookie = data[index+AssetManager.STYLE_ASSET_COOKIE]; outValue.resourceId = data[index+AssetManager.STYLE_RESOURCE_ID]; outValue.changingConfigurations = data[index+AssetManager.STYLE_CHANGING_CONFIGURATIONS]; + outValue.density = data[index+AssetManager.STYLE_DENSITY]; if (type == TypedValue.TYPE_STRING) { outValue.string = loadStringValueAt(index); } diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java index 045b0c2f0874..69ef98c0c3ce 100644 --- a/core/java/android/server/search/SearchableInfo.java +++ b/core/java/android/server/search/SearchableInfo.java @@ -103,6 +103,14 @@ public final class SearchableInfo implements Parcelable { } /** + * Gets the name of the package where the suggestion provider lives, + * or {@code null}. + */ + public String getSuggestPackage() { + return mSuggestProviderPackage; + } + + /** * Gets the component name of the searchable activity. */ public ComponentName getSearchActivity() { diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index b6119aa16061..f7cb06b22654 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -21,7 +21,6 @@ import com.android.internal.view.IInputMethodSession; import android.graphics.Canvas; import android.graphics.PixelFormat; -import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.Region; @@ -1213,6 +1212,8 @@ public final class ViewRoot extends Handler implements ViewParent, if (mTranslator != null) { mTranslator.translateCanvas(canvas); } + canvas.setScreenDensity(scalingRequired + ? DisplayMetrics.DENSITY_DEVICE : 0); mView.draw(canvas); if (Config.DEBUG && ViewDebug.consistencyCheckEnabled) { mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING); @@ -1321,6 +1322,8 @@ public final class ViewRoot extends Handler implements ViewParent, if (mTranslator != null) { mTranslator.translateCanvas(canvas); } + canvas.setScreenDensity(scalingRequired + ? DisplayMetrics.DENSITY_DEVICE : 0); mView.draw(canvas); } finally { mAttachInfo.mIgnoreDirtyState = false; diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 6a9bcfbb2fc4..b8f0a7e16f73 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -463,6 +463,7 @@ public class ImageView extends View { if (matrix == null && !mMatrix.isIdentity() || matrix != null && !mMatrix.equals(matrix)) { mMatrix.set(matrix); + configureBounds(); invalidate(); } } diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index 52acf04c21e8..1c2e055cfcf9 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -463,13 +463,22 @@ public: SkCanvas* canvas, SkBitmap* bitmap, jfloat left, jfloat top, SkPaint* paint, jint canvasDensity, - jint bitmapDensity) { + jint screenDensity, jint bitmapDensity) { SkScalar left_ = SkFloatToScalar(left); SkScalar top_ = SkFloatToScalar(top); if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) { - canvas->drawBitmap(*bitmap, left_, top_, paint); + if (screenDensity != 0 && screenDensity != bitmapDensity) { + SkPaint filteredPaint; + if (paint) { + filteredPaint = *paint; + } + filteredPaint.setFilterBitmap(true); + canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint); + } else { + canvas->drawBitmap(*bitmap, left_, top_, paint); + } } else { canvas->save(); SkScalar scale = SkFloatToScalar(canvasDensity / (float)bitmapDensity); @@ -489,30 +498,45 @@ public: } static void doDrawBitmap(JNIEnv* env, SkCanvas* canvas, SkBitmap* bitmap, - jobject srcIRect, const SkRect& dst, SkPaint* paint) { + jobject srcIRect, const SkRect& dst, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkIRect src, *srcPtr = NULL; if (NULL != srcIRect) { GraphicsJNI::jrect_to_irect(env, srcIRect, &src); srcPtr = &src; } - canvas->drawBitmapRect(*bitmap, srcPtr, dst, paint); + + if (screenDensity != 0 && screenDensity != bitmapDensity) { + SkPaint filteredPaint; + if (paint) { + filteredPaint = *paint; + } + filteredPaint.setFilterBitmap(true); + canvas->drawBitmapRect(*bitmap, srcPtr, dst, &filteredPaint); + } else { + canvas->drawBitmapRect(*bitmap, srcPtr, dst, paint); + } } static void drawBitmapRF(JNIEnv* env, jobject, SkCanvas* canvas, SkBitmap* bitmap, jobject srcIRect, - jobject dstRectF, SkPaint* paint) { + jobject dstRectF, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkRect dst; GraphicsJNI::jrectf_to_rect(env, dstRectF, &dst); - doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint); + doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint, + screenDensity, bitmapDensity); } static void drawBitmapRR(JNIEnv* env, jobject, SkCanvas* canvas, SkBitmap* bitmap, jobject srcIRect, - jobject dstRect, SkPaint* paint) { + jobject dstRect, SkPaint* paint, + jint screenDensity, jint bitmapDensity) { SkRect dst; GraphicsJNI::jrect_to_rect(env, dstRect, &dst); - doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint); + doDrawBitmap(env, canvas, bitmap, srcIRect, dst, paint, + screenDensity, bitmapDensity); } static void drawBitmapArray(JNIEnv* env, jobject, SkCanvas* canvas, @@ -906,11 +930,11 @@ static JNINativeMethod gCanvasMethods[] = { {"native_drawRoundRect","(ILandroid/graphics/RectF;FFI)V", (void*) SkCanvasGlue::drawRoundRect}, {"native_drawPath","(III)V", (void*) SkCanvasGlue::drawPath}, - {"native_drawBitmap","(IIFFIII)V", + {"native_drawBitmap","(IIFFIIII)V", (void*) SkCanvasGlue::drawBitmap__BitmapFFPaint}, - {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;I)V", + {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;III)V", (void*) SkCanvasGlue::drawBitmapRF}, - {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;I)V", + {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;III)V", (void*) SkCanvasGlue::drawBitmapRR}, {"native_drawBitmap", "(I[IIIFFIIZI)V", (void*)SkCanvasGlue::drawBitmapArray}, diff --git a/core/jni/android/graphics/MaskFilter.cpp b/core/jni/android/graphics/MaskFilter.cpp index e6048cdcea6a..0f8dff121055 100644 --- a/core/jni/android/graphics/MaskFilter.cpp +++ b/core/jni/android/graphics/MaskFilter.cpp @@ -4,15 +4,23 @@ #include <jni.h> +static void ThrowIAE_IfNull(JNIEnv* env, void* ptr) { + if (NULL == ptr) { + doThrowIAE(env); + } +} + class SkMaskFilterGlue { public: static void destructor(JNIEnv* env, jobject, SkMaskFilter* filter) { - SkASSERT(filter); - filter->unref(); + filter->safeUnref(); } static SkMaskFilter* createBlur(JNIEnv* env, jobject, float radius, int blurStyle) { - return SkBlurMaskFilter::Create(SkFloatToScalar(radius), (SkBlurMaskFilter::BlurStyle)blurStyle); + SkMaskFilter* filter = SkBlurMaskFilter::Create(SkFloatToScalar(radius), + (SkBlurMaskFilter::BlurStyle)blurStyle); + ThrowIAE_IfNull(env, filter); + return filter; } static SkMaskFilter* createEmboss(JNIEnv* env, jobject, jfloatArray dirArray, float ambient, float specular, float radius) { @@ -24,8 +32,12 @@ public: direction[i] = SkFloatToScalar(values[i]); } - return SkBlurMaskFilter::CreateEmboss(direction, SkFloatToScalar(ambient), - SkFloatToScalar(specular), SkFloatToScalar(radius)); + SkMaskFilter* filter = SkBlurMaskFilter::CreateEmboss(direction, + SkFloatToScalar(ambient), + SkFloatToScalar(specular), + SkFloatToScalar(radius)); + ThrowIAE_IfNull(env, filter); + return filter; } }; diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index b28eb900242c..b09c62b7d2b3 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -43,25 +43,23 @@ static int Color_HSVToColor(JNIEnv* env, jobject, int alpha, jfloatArray hsvArra static void Shader_destructor(JNIEnv* env, jobject, SkShader* shader) { - SkASSERT(shader != NULL); - shader->unref(); + shader->safeUnref(); } static bool Shader_getLocalMatrix(JNIEnv* env, jobject, const SkShader* shader, SkMatrix* matrix) { - SkASSERT(shader != NULL); - return shader->getLocalMatrix(matrix); + return shader ? shader->getLocalMatrix(matrix) : false; } static void Shader_setLocalMatrix(JNIEnv* env, jobject, SkShader* shader, const SkMatrix* matrix) { - SkASSERT(shader != NULL); - - if (NULL == matrix) { - shader->resetLocalMatrix(); - } - else { - shader->setLocalMatrix(*matrix); + if (shader) { + if (NULL == matrix) { + shader->resetLocalMatrix(); + } + else { + shader->setLocalMatrix(*matrix); + } } } diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 59f40670c41b..66b250670fee 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -74,12 +74,13 @@ static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL) } enum { - STYLE_NUM_ENTRIES = 5, + STYLE_NUM_ENTRIES = 6, STYLE_TYPE = 0, STYLE_DATA = 1, STYLE_ASSET_COOKIE = 2, STYLE_RESOURCE_ID = 3, - STYLE_CHANGING_CONFIGURATIONS = 4 + STYLE_CHANGING_CONFIGURATIONS = 4, + STYLE_DENSITY = 5 }; static jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, @@ -896,6 +897,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla ResTable::Theme* theme = (ResTable::Theme*)themeToken; const ResTable& res = theme->getResTable(); ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken; + ResTable_config config; Res_value value; const jsize NI = env->GetArrayLength(attrs); @@ -995,6 +997,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla value.dataType = Res_value::TYPE_NULL; value.data = 0; typeSetFlags = 0; + config.density = 0; // Skip through XML attributes until the end or the next possible match. while (ix < NX && curIdent > curXmlAttr) { @@ -1042,7 +1045,8 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = theme->resolveAttributeReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = theme->resolveAttributeReference(&value, block, + &resid, &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } else { // If we still don't have a value for this attribute, try to find @@ -1051,7 +1055,8 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla ssize_t newBlock = theme->getAttribute(curIdent, &value, &typeSetFlags); if (newBlock >= 0) { //printf("Resolving resource reference\n"); - newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } } @@ -1070,6 +1075,7 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1; dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { indicesIdx++; @@ -1108,6 +1114,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job } const ResTable& res(am->getResources()); ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken; + ResTable_config config; Res_value value; const jsize NI = env->GetArrayLength(attrs); @@ -1160,6 +1167,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job value.dataType = Res_value::TYPE_NULL; value.data = 0; typeSetFlags = 0; + config.density = 0; // Skip through XML attributes until the end or the next possible match. while (ix < NX && curIdent > curXmlAttr) { @@ -1179,7 +1187,8 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } @@ -1197,6 +1206,7 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1; dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { indicesIdx++; @@ -1250,6 +1260,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz return JNI_FALSE; } const ResTable& res(am->getResources()); + ResTable_config config; Res_value value; ssize_t block; @@ -1276,13 +1287,15 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz while (i < NV && arrayEnt < endArrayEnt) { block = arrayEnt->stringBlock; typeSetFlags = arrayTypeSetFlags; + config.density = 0; value = arrayEnt->map.value; uint32_t resid = 0; if (value.dataType != Res_value::TYPE_NULL) { // Take care of resolving the found resource to its final value. //printf("Resolving attribute reference\n"); - ssize_t newBlock = res.resolveReference(&value, block, &resid, &typeSetFlags); + ssize_t newBlock = res.resolveReference(&value, block, &resid, + &typeSetFlags, &config); if (newBlock >= 0) block = newBlock; } @@ -1299,6 +1312,7 @@ static jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject claz dest[STYLE_ASSET_COOKIE] = (jint)res.getTableCookie(block); dest[STYLE_RESOURCE_ID] = resid; dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; + dest[STYLE_DENSITY] = config.density; dest += STYLE_NUM_ENTRIES; i+= STYLE_NUM_ENTRIES; arrayEnt++; diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 4bbd178351b5..aaaebbb50985 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -909,12 +909,12 @@ you.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permlab_readPhoneState">read phone state</string> + <string name="permlab_readPhoneState">read phone state and identity</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_readPhoneState">Allows the application to access the phone features of the device. An application with this permission can determine the phone - number of this phone, whether a call is active, the number that call is connected to - and the like.</string> + number and serial number of this phone, whether a call is active, the number that call + is connected to and the like.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_wakeLock">prevent phone from sleeping</string> diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd new file mode 100644 index 000000000000..9af09188cb9f --- /dev/null +++ b/docs/html/guide/appendix/api-levels.jd @@ -0,0 +1,79 @@ +page.title=Android API Levels +@jd:body + + +<p>The Android <em>API Level</em> is an integer that indicates a set of APIs available in an Android SDK +and on a version of the Android platform. Each version of the Android platform supports a specific set +of APIs, which are always backward-compatible. For example, Android 1.5 supports all APIs available in +Android 1.0, but the reverse is not true. If an application uses APIs +available in Android 1.5 that are not available in 1.0, then the application should never be installed +on an Android 1.0 device, because it will fail due to missing APIs. The API Level ensures this does not happen +by comparing the minimum API Level required by the applicaiton to the API Level available on the device.</p> + +<p>When a new version of Android adds APIs, a new API Level is added to the platform. The new APIs +are available only to applications that declare a minimum API Level that is equal-to or greater-than +the API Level in which the APIs were introduced. The API Level required by an application is declared with the +<code><uses-sdk></code> element inside the Android manifest, like this:</p> + +<pre><uses-sdk android:minSdkVersion="3" /></pre> + +<p>The value for <code>minSdkVersion</code> is the minimum API Level required by the application. +If this is not declared, then it is assumed that the application is compatible with all versions and defaults to +API Level 1. In which case, if the application actually uses APIs introduced with an API Level greater than 1, then +the application will fail in unpredictable ways when installed on a device that only supports API Level 1 +(such as an Android 1.0 device). +See the <code><a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk></a></code> +documentation for more about declaring the API Level in your manifest.</p> + +<p>For example, the {@link android.appwidget} package was introduced with API Level 3. If your application +has set <code>minSdkVersion</code> to 1 or 2, then your application cannot use this package, +even if the device running your application uses a version of Android that supports it. +In order to use the {@link android.appwidget} package, your application must set <code>minSdkVersion</code> +to 3 or higher. When the <code>minSdkVersion</code> is set to 3, the application will no longer be able to install +on a device running a platform version with an API Level less than 3.</p> + +<p>Despite the name of the manifest attribute (<code>minSdkVersion</code>), the API Level is not directly +associated with a specific SDK. For example, the SDK for Android 1.0 uses +API Level 1 and the SDK for Android 1.1 uses API Level 2. So it may seem that the API Level increases consistently. +However, it's possible that a subsequent platform +releases will not introduce new APIs, and thus, the API Level will remain the same. In addition, there are often +multiple SDK releases for a single platform version (there were three SDK releases for Android 1.5), and +there's no guarantee that the API Level will remain the same between these. It's possible (but unlikely) that +a second or third SDK for a given version of the platform will provide new APIs and add a new API Level. +When you install a new SDK, be sure to read the SDK Contents on the install page, which specifies the API +Level for each platform available in the SDK. Also see the comparison of +<a href="#VersionsVsApiLevels">Platform Versions vs. API Levels</a>, below.</p> + +<p class="note"><strong>Note:</strong> During "preview" SDK releases, there may not yet be an official platform version +or API Level number specified. In these cases, a string value equal to the +current codename will be a valid value for <code>minSdkVersion</code>, instead of an integer. This codename value +will only be valid while using the preview SDK. When the final SDK is released, you must update your manifest to use +the official API Level integer.</p> + +<h2 id="VersionsVsApiLevels">Platform Versions vs. API Levels</h2> + +<p>The following table specifies the <em>maximum</em> API Level supported by each version of the Android platform.</p> + +<table> + <tr><th>Platform Version</th><th>API Level</th></tr> + <tr><td>Android 1.0</td><td>1</td></tr> + <tr><td>Android 1.1</td><td>2</td></tr> + <tr><td>Android 1.5</td><td>3</td></tr> + <tr><td>Android Donut</td><td>Donut</td></tr> +</table> + + +<h2 id="ViewingTheApiReference">Viewing the API Reference Based on API Level</h2> + +<p>The Android API reference includes information that specififies the minimum API Level required for each +package, class, and member. You can see this information on the right side of each header or label.</p> + +<p>By default, the reference documentation shows all APIs available with the latest SDK release. +This means that the reference assumes you're using the latest API Level and will show you everything available +with it. If you're developing applications for a version of Android that does not support the latest API Level, +then you can filter the reference to reveal only the packages, classes, and members available for that API Level. +When viewing the reference, use the "Filter by API Level" selection box (below the search bar) to pick the API Level +you'd like to view.</p> + + + diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index bc2e42e0919c..345f810ecf2a 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -50,6 +50,9 @@ public class Canvas { // Package-scoped for quick access. /*package*/ int mDensity = Bitmap.DENSITY_NONE; + + // Used to determine when compatibility scaling is in effect. + private int mScreenDensity = Bitmap.DENSITY_NONE; // Used by native code @SuppressWarnings({"UnusedDeclaration"}) @@ -219,6 +222,11 @@ public class Canvas { mDensity = density; } + /** @hide */ + public void setScreenDensity(int density) { + mScreenDensity = density; + } + // the SAVE_FLAG constants must match their native equivalents /** restore the current matrix when restore() is called */ @@ -971,7 +979,8 @@ public class Canvas { public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) { throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), left, top, - paint != null ? paint.mNativePaint : 0, mDensity, bitmap.mDensity); + paint != null ? paint.mNativePaint : 0, mDensity, mScreenDensity, + bitmap.mDensity); } /** @@ -1002,7 +1011,8 @@ public class Canvas { } throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst, - paint != null ? paint.mNativePaint : 0); + paint != null ? paint.mNativePaint : 0, + mScreenDensity, bitmap.mDensity); } /** @@ -1033,7 +1043,8 @@ public class Canvas { } throwIfRecycled(bitmap); native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst, - paint != null ? paint.mNativePaint : 0); + paint != null ? paint.mNativePaint : 0, + mScreenDensity, bitmap.mDensity); } /** @@ -1513,13 +1524,19 @@ public class Canvas { private native void native_drawBitmap(int nativeCanvas, int bitmap, float left, float top, int nativePaintOrZero, - int canvasDensity, int bitmapDensity); + int canvasDensity, + int screenDensity, + int bitmapDensity); private native void native_drawBitmap(int nativeCanvas, int bitmap, Rect src, RectF dst, - int nativePaintOrZero); + int nativePaintOrZero, + int screenDensity, + int bitmapDensity); private static native void native_drawBitmap(int nativeCanvas, int bitmap, Rect src, Rect dst, - int nativePaintOrZero); + int nativePaintOrZero, + int screenDensity, + int bitmapDensity); private static native void native_drawBitmap(int nativeCanvas, int[] colors, int offset, int stride, float x, float y, int width, int height, diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h index edd0cae63726..e524e2a31ed9 100644 --- a/include/utils/ResourceTypes.h +++ b/include/utils/ResourceTypes.h @@ -1655,7 +1655,8 @@ public: ssize_t resolveReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL) const; + uint32_t* inoutTypeSpecFlags = NULL, + ResTable_config* outConfig = NULL) const; enum { TMP_BUFFER_SIZE = 16 @@ -1729,7 +1730,8 @@ public: */ ssize_t resolveAttributeReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef = NULL, - uint32_t* inoutTypeSpecFlags = NULL) const; + uint32_t* inoutTypeSpecFlags = NULL, + ResTable_config* inoutConfig = NULL) const; void dumpToLog() const; diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp index 4dca8bd81608..0831f4a0c0f0 100644 --- a/libs/utils/ResourceTypes.cpp +++ b/libs/utils/ResourceTypes.cpp @@ -1486,7 +1486,7 @@ ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue, ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue, ssize_t blockIndex, uint32_t* outLastRef, - uint32_t* inoutTypeSpecFlags) const + uint32_t* inoutTypeSpecFlags, ResTable_config* inoutConfig) const { //printf("Resolving type=0x%x\n", inOutValue->dataType); if (inOutValue->dataType == Res_value::TYPE_ATTRIBUTE) { @@ -1498,7 +1498,8 @@ ssize_t ResTable::Theme::resolveAttributeReference(Res_value* inOutValue, return blockIndex; } } - return mTable.resolveReference(inOutValue, blockIndex, outLastRef); + return mTable.resolveReference(inOutValue, blockIndex, outLastRef, + inoutTypeSpecFlags, inoutConfig); } void ResTable::Theme::dumpToLog() const @@ -1891,7 +1892,8 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag } ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex, - uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags) const + uint32_t* outLastRef, uint32_t* inoutTypeSpecFlags, + ResTable_config* outConfig) const { int count=0; while (blockIndex >= 0 && value->dataType == value->TYPE_REFERENCE @@ -1899,7 +1901,8 @@ ssize_t ResTable::resolveReference(Res_value* value, ssize_t blockIndex, if (outLastRef) *outLastRef = value->data; uint32_t lastRef = value->data; uint32_t newFlags = 0; - const ssize_t newIndex = getResource(value->data, value, true, &newFlags); + const ssize_t newIndex = getResource(value->data, value, true, &newFlags, + outConfig); //LOGI("Resolving reference d=%p: newIndex=%d, t=0x%02x, d=%p\n", // (void*)lastRef, (int)newIndex, (int)value->dataType, (void*)value->data); //printf("Getting reference 0x%08x: newIndex=%d\n", value->data, newIndex); diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index 4fb0ead7ff59..d75d81d92e53 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -183,6 +183,7 @@ public class JetPlayer */ public void release() { native_release(); + singletonRef = null; } diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index 1fdecdd054df..00a121bfc6e5 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -93,7 +93,7 @@ SoundPool::~SoundPool() void SoundPool::addToRestartList(SoundChannel* channel) { - Mutex::Autolock lock(&mLock); + Mutex::Autolock lock(&mRestartLock); mRestart.push_back(channel); mCondition.signal(); } @@ -106,9 +106,9 @@ int SoundPool::beginThread(void* arg) int SoundPool::run() { - mLock.lock(); + mRestartLock.lock(); while (!mQuit) { - mCondition.wait(mLock); + mCondition.wait(mRestartLock); LOGV("awake"); if (mQuit) break; @@ -125,19 +125,19 @@ int SoundPool::run() mRestart.clear(); mCondition.signal(); - mLock.unlock(); + mRestartLock.unlock(); LOGV("goodbye"); return 0; } void SoundPool::quit() { - mLock.lock(); + mRestartLock.lock(); mQuit = true; mCondition.signal(); - mCondition.wait(mLock); + mCondition.wait(mRestartLock); LOGV("return from quit"); - mLock.unlock(); + mRestartLock.unlock(); } bool SoundPool::startThreads() @@ -484,11 +484,8 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV // if not idle, this voice is being stolen if (mState != IDLE) { LOGV("channel %d stolen - event queued for channel %d", channelID(), nextChannelID); - stop_l(); mNextEvent.set(sample, nextChannelID, leftVolume, rightVolume, priority, loop, rate); -#ifdef USE_SHARED_MEM_BUFFER - mSoundPool->done(this); -#endif + stop(); return; } diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h index 78027812fb95..ab86e90ef3a7 100644 --- a/media/jni/soundpool/SoundPool.h +++ b/media/jni/soundpool/SoundPool.h @@ -204,6 +204,7 @@ private: jobject mSoundPoolRef; Mutex mLock; + Mutex mRestartLock; Condition mCondition; SoundPoolThread* mDecodeThread; SoundChannel* mChannelPool; diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index b39f2f666571..bd79d1dd3fa1 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -494,7 +494,7 @@ class PackageManagerService extends IPackageManager.Stub { mDrmAppInstallObserver = new AppDirObserver( mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false); mDrmAppInstallObserver.startWatching(); - scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode); + scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode | SCAN_FORWARD_LOCKED); EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_SCAN_END, SystemClock.uptimeMillis()); @@ -1763,7 +1763,12 @@ class PackageManagerService extends IPackageManager.Stub { int i; for (i=0; i<files.length; i++) { File file = new File(dir, files[i]); - PackageParser.Package pkg = scanPackageLI(file, file, file, + File resFile = file; + // Pick up the resource path from settings for fwd locked apps + if ((scanMode & SCAN_FORWARD_LOCKED) != 0) { + resFile = null; + } + PackageParser.Package pkg = scanPackageLI(file, file, resFile, flags|PackageParser.PARSE_MUST_BE_APK, scanMode); } } @@ -1865,8 +1870,12 @@ class PackageManagerService extends IPackageManager.Stub { if (ps != null && !ps.codePath.equals(ps.resourcePath)) { scanMode |= SCAN_FORWARD_LOCKED; } + File resFile = destResourceFile; + if ((scanMode & SCAN_FORWARD_LOCKED) != 0) { + resFile = getFwdLockedResource(ps.name); + } // Note that we invoke the following method only if we are about to unpack an application - return scanPackageLI(scanFile, destCodeFile, destResourceFile, + return scanPackageLI(scanFile, destCodeFile, resFile, pkg, parseFlags, scanMode | SCAN_UPDATE_SIGNATURE); } @@ -3808,6 +3817,11 @@ class PackageManagerService extends IPackageManager.Stub { } } + private File getFwdLockedResource(String pkgName) { + final String publicZipFileName = pkgName + ".zip"; + return new File(mAppInstallDir, publicZipFileName); + } + private PackageInstalledInfo installPackageLI(Uri pPackageURI, int pFlags, boolean newInstall, String installerPackageName) { File tmpPackageFile = null; @@ -3887,8 +3901,7 @@ class PackageManagerService extends IPackageManager.Stub { final String destFilePath = destPackageFile.getAbsolutePath(); File destResourceFile; if ((pFlags&PackageManager.INSTALL_FORWARD_LOCK) != 0) { - final String publicZipFileName = pkgName + ".zip"; - destResourceFile = new File(mAppInstallDir, publicZipFileName); + destResourceFile = getFwdLockedResource(pkgName); forwardLocked = true; } else { destResourceFile = destPackageFile; diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 890f930c337b..82539fb7132b 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -40,7 +40,6 @@ import java.util.List; /** * Manages SMS operations such as sending data, text, and pdu SMS messages. * Get this object by calling the static method SmsManager.getDefault(). - * @hide */ public final class SmsManager { private static SmsManager sInstance; @@ -202,6 +201,8 @@ public final class SmsManager { /** * Send a raw SMS PDU. + * A PDU is a protocol data unit. It contains the message and the + * associated meta information. * * @param smsc the SMSC to send the message through, or NULL for the * default SMSC @@ -219,8 +220,6 @@ public final class SmsManager { * @param deliveryIntent if not NULL this <code>PendingIntent</code> is * broadcast when the message is delivered to the recipient. The * raw pdu of the status report is in the extended data ("pdu"). - * - * @hide */ private void sendRawPdu(byte[] smsc, byte[] pdu, PendingIntent sentIntent, PendingIntent deliveryIntent) { @@ -252,6 +251,8 @@ public final class SmsManager { /** * Copy a raw SMS PDU to the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param smsc the SMSC for this message, or NULL for the default SMSC * @param pdu the raw PDU to store @@ -278,6 +279,8 @@ public final class SmsManager { /** * Delete the specified message from the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param messageIndex is the record index of the message on ICC * @return true for success @@ -304,6 +307,8 @@ public final class SmsManager { /** * Update the specified message on the ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @param messageIndex record index of message to update * @param newStatus new message status (STATUS_ON_ICC_READ, @@ -331,6 +336,8 @@ public final class SmsManager { /** * Retrieves all messages currently stored on ICC. + * ICC (Integrated Circuit Card) is the card of the device. + * For example, this can be the SIM or USIM for GSM. * * @return <code>ArrayList</code> of <code>SmsMessage</code> objects * @@ -359,12 +366,12 @@ public final class SmsManager { * <code>getAllMessagesFromIcc</code> * @return <code>ArrayList</code> of <code>SmsMessage</code> objects. */ - private ArrayList<SmsMessage> createMessageListFromRawRecords(List records) { + private ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { ArrayList<SmsMessage> messages = new ArrayList<SmsMessage>(); if (records != null) { int count = records.size(); for (int i = 0; i < count; i++) { - SmsRawData data = (SmsRawData)records.get(i); + SmsRawData data = records.get(i); // List contains all records, including "free" records (null) if (data != null) { SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes()); diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java index fc491d76b962..0617dada43e6 100644 --- a/telephony/java/android/telephony/SmsMessage.java +++ b/telephony/java/android/telephony/SmsMessage.java @@ -28,13 +28,13 @@ import com.android.internal.telephony.SmsMessageBase.TextEncodingDetails; import java.lang.Math; import java.util.ArrayList; +import java.util.Arrays; import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA; /** * A Short Message Service message. - * @hide */ public class SmsMessage { private static final boolean LOCAL_DEBUG = true; @@ -49,18 +49,6 @@ public class SmsMessage { UNKNOWN, CLASS_0, CLASS_1, CLASS_2, CLASS_3; } - /** - * TODO(cleanup): given that we now have more than one possible - * 7bit encoding, this result starts to look rather vague and - * maybe confusing... If this is just an indication of code unit - * size, maybe that is no problem. Otherwise, should we try to - * create an aggregate collection of GSM and CDMA encodings? CDMA - * contains a superset of the encodings we use (it does not - * support 8-bit GSM, but we also do not use that encoding - * currently)... We could get rid of these and directly reference - * the CDMA encoding definitions... - */ - /** User data text encoding code unit size */ public static final int ENCODING_UNKNOWN = 0; public static final int ENCODING_7BIT = 1; @@ -71,24 +59,9 @@ public class SmsMessage { public static final int MAX_USER_DATA_BYTES = 140; /** - * TODO(cleanup): It would be more flexible and less fragile to - * rewrite this (meaning get rid of the following constant) such - * that an actual UDH is taken into consideration (meaning its - * length is measured), allowing for messages that actually - * contain other UDH fields... Hence it is actually a shame to - * extend the API with this constant. If necessary, maybe define - * the size of such a header and let the math for calculating - * max_octets/septets be done elsewhere. And, while I am griping, - * if we use the word septet, we should use the word octet in - * corresponding places, not byte... - */ - - /** * The maximum number of payload bytes per message if a user data header * is present. This assumes the header only contains the * CONCATENATED_8_BIT_REFERENCE element. - * - * @hide pending API Council approval to extend the public API */ public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134; @@ -103,17 +76,26 @@ public class SmsMessage { public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; /** Contains actual SmsMessage. Only public for debugging and for framework layer. - * {@hide} - */ + * + * @hide + */ public SmsMessageBase mWrappedSmsMessage; - public static class SubmitPdu extends SubmitPduBase { + public static class SubmitPdu { - //Constructor - public SubmitPdu() { + public byte[] encodedScAddress; // Null if not applicable. + public byte[] encodedMessage; + + public String toString() { + return "SubmitPdu: encodedScAddress = " + + Arrays.toString(encodedScAddress) + + ", encodedMessage = " + + Arrays.toString(encodedMessage); } - /* {@hide} */ + /** + * @hide + */ protected SubmitPdu(SubmitPduBase spb) { this.encodedMessage = spb.encodedMessage; this.encodedScAddress = spb.encodedScAddress; @@ -121,7 +103,11 @@ public class SmsMessage { } - // Constructor + /** + * Constructor + * + * @hide + */ public SmsMessage() { this(getSmsFacility()); } @@ -295,6 +281,8 @@ public class SmsMessage { * @param text text, must not be null. * @return an <code>ArrayList</code> of strings that, in order, * comprise the original msg text + * + * @hide */ public static ArrayList<String> fragmentText(String text) { int activePhone = TelephonyManager.getDefault().getPhoneType(); @@ -343,10 +331,11 @@ public class SmsMessage { * current encoding. * * @param messageBody the message to encode - * @param use7bitOnly if true, characters that are not part of the GSM - * alphabet are counted as a single space char. If false, a - * messageBody containing non-GSM alphabet characters is calculated - * for 16-bit encoding. + * @param use7bitOnly if true, characters that are not part of the radio + * specific (GSM / CDMA) alphabet encoding are converted to as a + * single space characters. If false, a messageBody containing + * non-GSM or non-CDMA alphabet characters are encoded using + * 16-bit encoding. * @return an int[4] with int[0] being the number of SMS's required, int[1] * the number of code units used, and int[2] is the number of code * units remaining until the next message. int[3] is the encoding @@ -688,6 +677,8 @@ public class SmsMessage { /** This method returns the reference to a specific * SmsMessage object, which is used for accessing its static methods. * @return Specific SmsMessage. + * + * @hide */ private static final SmsMessageBase getSmsFacility(){ int activePhone = TelephonyManager.getDefault().getPhoneType(); diff --git a/telephony/java/android/telephony/gsm/SmsManager.java b/telephony/java/android/telephony/gsm/SmsManager.java index cdd707e629a2..241c4852c4eb 100644 --- a/telephony/java/android/telephony/gsm/SmsManager.java +++ b/telephony/java/android/telephony/gsm/SmsManager.java @@ -43,6 +43,7 @@ import java.util.ArrayList; return sInstance; } + @Deprecated private SmsManager() { mSmsMgrProxy = android.telephony.SmsManager.getDefault(); } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 1f4ce3d1d79e..0763e63e7c9a 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -86,14 +86,6 @@ cat include/telephony/ril.h | \ >>java/android/com.android.internal.telephony/gsm/RILConstants.java */ - - int RIL_SIM_ABSENT = 0; - int RIL_SIM_NOT_READY = 1; - int RIL_SIM_READY = 2; - int RIL_SIM_PIN = 3; - int RIL_SIM_PUK = 4; - int RIL_SIM_NETWORK_PERSONALIZATION = 5; - /** * No restriction at all including voice/SMS/USSD/SS/AV64 * and packet data. diff --git a/telephony/java/com/android/internal/telephony/SmsMessageBase.java b/telephony/java/com/android/internal/telephony/SmsMessageBase.java index 3c7dd458f94b..8b9ccb4c636d 100644 --- a/telephony/java/com/android/internal/telephony/SmsMessageBase.java +++ b/telephony/java/com/android/internal/telephony/SmsMessageBase.java @@ -118,6 +118,7 @@ public abstract class SmsMessageBase { public int codeUnitSize; } + // TODO(): This class is duplicated in SmsMessage.java. Refactor accordingly. public static abstract class SubmitPduBase { public byte[] encodedScAddress; // Null if not applicable. public byte[] encodedMessage; diff --git a/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png b/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png Binary files differnew file mode 100644 index 000000000000..4d717a86143d --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/reslogo240dpi.png diff --git a/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png b/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png Binary files differnew file mode 100644 index 000000000000..4d717a86143d --- /dev/null +++ b/tests/DpiTest/res/drawable-hdpi/stylogo240dpi.png diff --git a/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png b/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png Binary files differnew file mode 100644 index 000000000000..46bbd5bd3d48 --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/reslogo120dpi.png diff --git a/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png b/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png Binary files differnew file mode 100644 index 000000000000..46bbd5bd3d48 --- /dev/null +++ b/tests/DpiTest/res/drawable-ldpi/stylogo120dpi.png diff --git a/tests/DpiTest/res/drawable/reslogo160dpi.png b/tests/DpiTest/res/drawable/reslogo160dpi.png Binary files differnew file mode 100644 index 000000000000..c23b2ce83b43 --- /dev/null +++ b/tests/DpiTest/res/drawable/reslogo160dpi.png diff --git a/tests/DpiTest/res/drawable/stylogo160dpi.png b/tests/DpiTest/res/drawable/stylogo160dpi.png Binary files differnew file mode 100644 index 000000000000..c23b2ce83b43 --- /dev/null +++ b/tests/DpiTest/res/drawable/stylogo160dpi.png diff --git a/tests/DpiTest/res/layout/image_views.xml b/tests/DpiTest/res/layout/image_views.xml new file mode 100644 index 000000000000..6a91497f720d --- /dev/null +++ b/tests/DpiTest/res/layout/image_views.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2009 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo120dpi" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo160dpi" /> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/reslogo240dpi" /> + +</LinearLayout> diff --git a/tests/DpiTest/res/layout/styled_image_views.xml b/tests/DpiTest/res/layout/styled_image_views.xml new file mode 100644 index 000000000000..86c63bf23c39 --- /dev/null +++ b/tests/DpiTest/res/layout/styled_image_views.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2009 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <ImageView style="@style/ImageView120dpi" /> + <ImageView style="@style/ImageView160dpi" /> + <ImageView style="@style/ImageView240dpi" /> + +</LinearLayout> diff --git a/tests/DpiTest/res/values/styles.xml b/tests/DpiTest/res/values/styles.xml new file mode 100644 index 000000000000..bb4b13c6c5e7 --- /dev/null +++ b/tests/DpiTest/res/values/styles.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2009 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. +--> + +<resources> + <style name="ImageView120dpi"> + <item name="android:src">@drawable/stylogo120dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="ImageView160dpi"> + <item name="android:src">@drawable/stylogo160dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> + + <style name="ImageView240dpi"> + <item name="android:src">@drawable/stylogo240dpi</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> +</resources> diff --git a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java index 68220a103924..ae53b7666960 100644 --- a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java +++ b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java @@ -28,6 +28,7 @@ import android.graphics.drawable.Drawable; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ScrollView; +import android.view.LayoutInflater; import android.view.View; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -71,6 +72,9 @@ public class DpiTestActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + final LayoutInflater li = (LayoutInflater)getSystemService( + LAYOUT_INFLATER_SERVICE); + this.setTitle(R.string.act_title); LinearLayout root = new LinearLayout(this); root.setOrientation(LinearLayout.VERTICAL); @@ -96,6 +100,14 @@ public class DpiTestActivity extends Activity { addLabelToRoot(root, "Prescaled resource drawable"); addChildToRoot(root, layout); + layout = (LinearLayout)li.inflate(R.layout.image_views, null); + addLabelToRoot(root, "Inflated layout"); + addChildToRoot(root, layout); + + layout = (LinearLayout)li.inflate(R.layout.styled_image_views, null); + addLabelToRoot(root, "Inflated styled layout"); + addChildToRoot(root, layout); + layout = new LinearLayout(this); addCanvasBitmap(layout, R.drawable.logo120dpi, true); addCanvasBitmap(layout, R.drawable.logo160dpi, true); |