diff options
16 files changed, 275 insertions, 61 deletions
diff --git a/api/current.xml b/api/current.xml index d8609ec452a9..b052a61718ee 100644 --- a/api/current.xml +++ b/api/current.xml @@ -34212,6 +34212,17 @@ visibility="public" > </field> +<field name="EXTRA_CHANGED_COMPONENT_NAME" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.intent.extra.changed_component_name"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="EXTRA_DATA_REMOVED" type="java.lang.String" transient="false" diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 5ed89418238f..8cfb75830728 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -1397,7 +1397,7 @@ public class AccountManagerService extends IAccountManager.Stub { Log.v(TAG, "current IMSI=" + imsi + "; stored IMSI=" + storedImsi); } - if (!imsi.equals(storedImsi) && !"initial".equals(storedImsi)) { + if (!imsi.equals(storedImsi) && !TextUtils.isEmpty(storedImsi)) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "wiping all passwords and authtokens"); } diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 6bd2a5abc3ae..8975fe27b7c2 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -312,7 +312,7 @@ public final class BluetoothAdapter { BluetoothServerSocket socket = new BluetoothServerSocket( BluetoothSocket.TYPE_RFCOMM, true, true, channel); try { - socket.mSocket.bindListenNative(); + socket.mSocket.bindListen(); } catch (IOException e) { try { socket.close(); @@ -334,7 +334,7 @@ public final class BluetoothAdapter { BluetoothServerSocket socket = new BluetoothServerSocket( BluetoothSocket.TYPE_RFCOMM, false, false, port); try { - socket.mSocket.bindListenNative(); + socket.mSocket.bindListen(); } catch (IOException e) { try { socket.close(); @@ -356,7 +356,7 @@ public final class BluetoothAdapter { BluetoothServerSocket socket = new BluetoothServerSocket( BluetoothSocket.TYPE_SCO, false, false, -1); try { - socket.mSocket.bindListenNative(); + socket.mSocket.bindListen(); } catch (IOException e) { try { socket.close(); diff --git a/core/java/android/bluetooth/BluetoothInputStream.java b/core/java/android/bluetooth/BluetoothInputStream.java index c060f3263eeb..03af95337c50 100644 --- a/core/java/android/bluetooth/BluetoothInputStream.java +++ b/core/java/android/bluetooth/BluetoothInputStream.java @@ -37,7 +37,7 @@ import java.io.InputStream; * Return number of bytes available before this stream will block. */ public int available() throws IOException { - return mSocket.availableNative(); + return mSocket.available(); } public void close() throws IOException { @@ -57,7 +57,7 @@ import java.io.InputStream; */ public int read() throws IOException { byte b[] = new byte[1]; - int ret = mSocket.readNative(b, 0, 1); + int ret = mSocket.read(b, 0, 1); if (ret == 1) { return (int)b[0] & 0xff; } else { @@ -93,6 +93,6 @@ import java.io.InputStream; if ((offset | length) < 0 || length > b.length - offset) { throw new ArrayIndexOutOfBoundsException("invalid offset or length"); } - return mSocket.readNative(b, offset, length); + return mSocket.read(b, offset, length); } } diff --git a/core/java/android/bluetooth/BluetoothOutputStream.java b/core/java/android/bluetooth/BluetoothOutputStream.java index 7e2ead478afb..62242a2672ff 100644 --- a/core/java/android/bluetooth/BluetoothOutputStream.java +++ b/core/java/android/bluetooth/BluetoothOutputStream.java @@ -53,7 +53,7 @@ import java.io.OutputStream; public void write(int oneByte) throws IOException { byte b[] = new byte[1]; b[0] = (byte)oneByte; - mSocket.writeNative(b, 0, 1); + mSocket.write(b, 0, 1); } /** @@ -82,6 +82,6 @@ import java.io.OutputStream; if ((offset | count) < 0 || count > b.length - offset) { throw new IndexOutOfBoundsException("invalid offset or length"); } - mSocket.writeNative(b, offset, count); + mSocket.write(b, offset, count); } } diff --git a/core/java/android/bluetooth/BluetoothServerSocket.java b/core/java/android/bluetooth/BluetoothServerSocket.java index e653c23295f4..b65084157ebb 100644 --- a/core/java/android/bluetooth/BluetoothServerSocket.java +++ b/core/java/android/bluetooth/BluetoothServerSocket.java @@ -47,6 +47,7 @@ import java.io.IOException; * operations and close the socket. */ public final class BluetoothServerSocket implements Closeable { + /*package*/ final BluetoothSocket mSocket; /** @@ -88,7 +89,7 @@ public final class BluetoothServerSocket implements Closeable { * timeout */ public BluetoothSocket accept(int timeout) throws IOException { - return mSocket.acceptNative(timeout); + return mSocket.accept(timeout); } /** @@ -97,6 +98,6 @@ public final class BluetoothServerSocket implements Closeable { * throw an IOException. */ public void close() throws IOException { - mSocket.closeNative(); + mSocket.close(); } } diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index eae0f3716e90..ccbe23e55c7a 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.concurrent.locks.ReentrantReadWriteLock; + /** * A connected or connecting Bluetooth socket. * @@ -63,7 +65,14 @@ public final class BluetoothSocket implements Closeable { private final BluetoothInputStream mInputStream; private final BluetoothOutputStream mOutputStream; - private int mSocketData; /* used by native code only */ + /** prevents all native calls after destroyNative() */ + private boolean mClosed; + + /** protects mClosed */ + private final ReentrantReadWriteLock mLock; + + /** used by native code only */ + private int mSocketData; /** * Construct a BluetoothSocket. @@ -95,6 +104,8 @@ public final class BluetoothSocket implements Closeable { } mInputStream = new BluetoothInputStream(this); mOutputStream = new BluetoothOutputStream(this); + mClosed = false; + mLock = new ReentrantReadWriteLock(); } /** @@ -132,7 +143,13 @@ public final class BluetoothSocket implements Closeable { * @throws IOException on error, for example connection failure */ public void connect() throws IOException { - connectNative(); + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + connectNative(); + } finally { + mLock.readLock().unlock(); + } } /** @@ -141,7 +158,24 @@ public final class BluetoothSocket implements Closeable { * throw an IOException. */ public void close() throws IOException { - closeNative(); + // abort blocking operations on the socket + mLock.readLock().lock(); + try { + if (mClosed) return; + abortNative(); + } finally { + mLock.readLock().unlock(); + } + + // all native calls are guarenteed to immediately return after + // abortNative(), so this lock should immediatley acquire + mLock.writeLock().lock(); + try { + mClosed = true; + destroyNative(); + } finally { + mLock.writeLock().unlock(); + } } /** @@ -174,14 +208,64 @@ public final class BluetoothSocket implements Closeable { return mOutputStream; } + /*package*/ void bindListen() throws IOException { + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + bindListenNative(); + } finally { + mLock.readLock().unlock(); + } + } + + /*package*/ BluetoothSocket accept(int timeout) throws IOException { + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + return acceptNative(timeout); + } finally { + mLock.readLock().unlock(); + } + } + + /*package*/ int available() throws IOException { + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + return availableNative(); + } finally { + mLock.readLock().unlock(); + } + } + + /*package*/ int read(byte[] b, int offset, int length) throws IOException { + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + return readNative(b, offset, length); + } finally { + mLock.readLock().unlock(); + } + } + + /*package*/ int write(byte[] b, int offset, int length) throws IOException { + mLock.readLock().lock(); + try { + if (mClosed) throw new IOException("socket closed"); + return writeNative(b, offset, length); + } finally { + mLock.readLock().unlock(); + } + } + private native void initSocketNative() throws IOException; private native void initSocketFromFdNative(int fd) throws IOException; private native void connectNative() throws IOException; - /*package*/ native void bindListenNative() throws IOException; - /*package*/ native BluetoothSocket acceptNative(int timeout) throws IOException; - /*package*/ native int availableNative() throws IOException; - /*package*/ native int readNative(byte[] b, int offset, int length) throws IOException; - /*package*/ native int writeNative(byte[] b, int offset, int length) throws IOException; - /*package*/ native void closeNative() throws IOException; + private native void bindListenNative() throws IOException; + private native BluetoothSocket acceptNative(int timeout) throws IOException; + private native int availableNative() throws IOException; + private native int readNative(byte[] b, int offset, int length) throws IOException; + private native int writeNative(byte[] b, int offset, int length) throws IOException; + private native void abortNative() throws IOException; private native void destroyNative() throws IOException; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 59529be4b35d..87a8f391bb37 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1267,6 +1267,8 @@ public class Intent implements Parcelable { * enabled or disabled. The data contains the name of the package. * <ul> * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. + * <li> {@link #EXTRA_CHANGED_COMPONENT_NAME} containing the class name of the changed component. + * <li> {@link #EXTRA_DONT_KILL_APP} containing boolean field to override the default action of restarting the application. * </ul> * * <p class="note">This is a protected intent that can only be sent @@ -2034,6 +2036,14 @@ public class Intent implements Parcelable { public static final String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token"; + /** + * Used as an int extra field in {@link android.content.Intent#ACTION_PACKAGE_CHANGED} + * intent to supply the name of the component that changed. + * + */ + public static final String EXTRA_CHANGED_COMPONENT_NAME = + "android.intent.extra.changed_component_name"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Intent flags (see mFlags variable). diff --git a/core/java/android/provider/Gmail.java b/core/java/android/provider/Gmail.java index 4425e51db384..073ae6c29441 100644 --- a/core/java/android/provider/Gmail.java +++ b/core/java/android/provider/Gmail.java @@ -1548,11 +1548,12 @@ public final class Gmail { getLabelIdValues(labelId).getAsInteger(LabelColumns.NUM_UNREAD_CONVERSATIONS); // There seems to be a race condition here that can get the label maps into a bad // state and lose state on a particular label. - if (unreadConversations == null) { - return 0; - } else { - return unreadConversations; + int result = 0; + if (unreadConversations != null) { + result = unreadConversations < 0 ? 0 : unreadConversations; } + + return result; } /** diff --git a/core/java/com/android/internal/widget/ContactHeaderWidget.java b/core/java/com/android/internal/widget/ContactHeaderWidget.java index 8bae3e478fe9..ce0c9cbb41e7 100644 --- a/core/java/com/android/internal/widget/ContactHeaderWidget.java +++ b/core/java/com/android/internal/widget/ContactHeaderWidget.java @@ -425,6 +425,11 @@ public class ContactHeaderWidget extends FrameLayout implements View.OnClickList } public void onClick(View view) { + // Make sure there is a contact + if (mContactUri == null) { + return; + } + switch (view.getId()) { case R.id.star: { // Toggle "starred" state diff --git a/core/jni/android_bluetooth_BluetoothSocket.cpp b/core/jni/android_bluetooth_BluetoothSocket.cpp index 0aeaadc34667..51cf0cb9232c 100644 --- a/core/jni/android_bluetooth_BluetoothSocket.cpp +++ b/core/jni/android_bluetooth_BluetoothSocket.cpp @@ -468,7 +468,7 @@ static jint writeNative(JNIEnv *env, jobject obj, jbyteArray jb, jint offset, return -1; } -static void closeNative(JNIEnv *env, jobject obj) { +static void abortNative(JNIEnv *env, jobject obj) { #ifdef HAVE_BLUETOOTH LOGV(__FUNCTION__); struct asocket *s = get_socketData(env, obj); @@ -510,7 +510,7 @@ static JNINativeMethod sMethods[] = { {"availableNative", "()I", (void *) availableNative}, {"readNative", "([BII)I", (void *) readNative}, {"writeNative", "([BII)I", (void *) writeNative}, - {"closeNative", "()V", (void *) closeNative}, + {"abortNative", "()V", (void *) abortNative}, {"destroyNative", "()V", (void *) destroyNative}, }; diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 8ec6ec38e851..14cd7a86f0bd 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -62,6 +62,8 @@ import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; import android.os.Parcel; import android.os.RemoteException; import android.os.Environment; @@ -140,7 +142,7 @@ class PackageManagerService extends IPackageManager.Stub { final HandlerThread mHandlerThread = new HandlerThread("PackageManager", Process.THREAD_PRIORITY_BACKGROUND); - final Handler mHandler; + final PackageHandler mHandler; final int mSdkVersion = Build.VERSION.SDK_INT; final String mSdkCodename = "REL".equals(Build.VERSION.CODENAME) @@ -272,6 +274,49 @@ class PackageManagerService extends IPackageManager.Stub { ComponentName mResolveComponentName; PackageParser.Package mPlatformPackage; + // Set of pending broadcasts for aggregating enable/disable of components. + final HashMap<String, String> mPendingBroadcasts = new HashMap<String, String>(); + static final int SEND_PENDING_BROADCAST = 1; + // Delay time in millisecs + static final int BROADCAST_DELAY = 10 * 1000; + + class PackageHandler extends Handler { + PackageHandler(Looper looper) { + super(looper); + } + public void handleMessage(Message msg) { + switch (msg.what) { + case SEND_PENDING_BROADCAST : { + int size = 0; + String broadcastList[]; + HashMap<String, String> tmpMap; + int uids[]; + synchronized (mPackages) { + size = mPendingBroadcasts.size(); + if (size <= 0) { + // Nothing to be done. Just return + return; + } + broadcastList = new String[size]; + mPendingBroadcasts.keySet().toArray(broadcastList); + tmpMap = new HashMap<String, String>(mPendingBroadcasts); + uids = new int[size]; + for (int i = 0; i < size; i++) { + PackageSetting ps = mSettings.mPackages.get(mPendingBroadcasts.get(broadcastList[i])); + uids[i] = (ps != null) ? ps.userId : -1; + } + mPendingBroadcasts.clear(); + } + // Send broadcasts + for (int i = 0; i < size; i++) { + String className = broadcastList[i]; + sendPackageChangedBroadcast(className, true, tmpMap.get(className), uids[i]); + } + break; + } + } + } + } public static final IPackageManager main(Context context, boolean factoryTest) { PackageManagerService m = new PackageManagerService(context, factoryTest); ServiceManager.addService("package", m); @@ -355,7 +400,7 @@ class PackageManagerService extends IPackageManager.Stub { synchronized (mInstallLock) { synchronized (mPackages) { mHandlerThread.start(); - mHandler = new Handler(mHandlerThread.getLooper()); + mHandler = new PackageHandler(mHandlerThread.getLooper()); File dataDir = Environment.getDataDirectory(); mAppDataDir = new File(dataDir, "data"); @@ -4866,7 +4911,7 @@ class PackageManagerService extends IPackageManager.Stub { } private void setEnabledSetting( - final String packageNameStr, String classNameStr, int newState, final int flags) { + final String packageName, String className, int newState, final int flags) { if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT || newState == COMPONENT_ENABLED_STATE_ENABLED || newState == COMPONENT_ENABLED_STATE_DISABLED)) { @@ -4878,17 +4923,20 @@ class PackageManagerService extends IPackageManager.Stub { final int permission = mContext.checkCallingPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); + boolean sendNow = false; + boolean isApp = (className == null); + String key = isApp ? packageName : className; int packageUid = -1; synchronized (mPackages) { - pkgSetting = mSettings.mPackages.get(packageNameStr); + pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null) { - if (classNameStr == null) { + if (className == null) { throw new IllegalArgumentException( - "Unknown package: " + packageNameStr); + "Unknown package: " + packageName); } throw new IllegalArgumentException( - "Unknown component: " + packageNameStr - + "/" + classNameStr); + "Unknown component: " + packageName + + "/" + className); } if (!allowedByPermission && (uid != pkgSetting.userId)) { throw new SecurityException( @@ -4896,41 +4944,67 @@ class PackageManagerService extends IPackageManager.Stub { + Binder.getCallingPid() + ", uid=" + uid + ", package uid=" + pkgSetting.userId); } - packageUid = pkgSetting.userId; - if (classNameStr == null) { + if (className == null) { // We're dealing with an application/package level state change pkgSetting.enabled = newState; } else { // We're dealing with a component level state change switch (newState) { case COMPONENT_ENABLED_STATE_ENABLED: - pkgSetting.enableComponentLP(classNameStr); + pkgSetting.enableComponentLP(className); break; case COMPONENT_ENABLED_STATE_DISABLED: - pkgSetting.disableComponentLP(classNameStr); + pkgSetting.disableComponentLP(className); break; case COMPONENT_ENABLED_STATE_DEFAULT: - pkgSetting.restoreComponentLP(classNameStr); + pkgSetting.restoreComponentLP(className); break; default: Log.e(TAG, "Invalid new component state: " + newState); + return; } } mSettings.writeLP(); + packageUid = pkgSetting.userId; + if ((flags&PackageManager.DONT_KILL_APP) == 0) { + sendNow = true; + // Purge entry from pending broadcast list if another one exists already + // since we are sending one right away. + if (mPendingBroadcasts.get(key) != null) { + mPendingBroadcasts.remove(key); + // Can ignore empty list since its handled in the handler anyway + } + } else { + if (mPendingBroadcasts.get(key) == null) { + mPendingBroadcasts.put(key, packageName); + } + if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { + // Schedule a message + mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); + } + } } - + long callingId = Binder.clearCallingIdentity(); try { - Bundle extras = new Bundle(2); - extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, - (flags&PackageManager.DONT_KILL_APP) != 0); - extras.putInt(Intent.EXTRA_UID, packageUid); - sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageNameStr, extras); + if (sendNow) { + sendPackageChangedBroadcast(packageName, + (flags&PackageManager.DONT_KILL_APP) != 0, key, packageUid); + } } finally { Binder.restoreCallingIdentity(callingId); } } + private void sendPackageChangedBroadcast(String packageName, + boolean killFlag, String componentName, int packageUid) { + Bundle extras = new Bundle(2); + extras.putString(Intent.EXTRA_CHANGED_COMPONENT_NAME, componentName); + extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, killFlag); + extras.putInt(Intent.EXTRA_UID, packageUid); + sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras); + } + public String getInstallerPackageName(String packageName) { synchronized (mPackages) { PackageSetting pkg = mSettings.mPackages.get(packageName); diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 38add94bd01f..252a6d20db6d 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -7414,8 +7414,6 @@ public final class ActivityManagerService extends ActivityManagerNative implemen // In this case the provider is a single instance, so we can // return it right away. if (r != null) { - if(true) Log.v(TAG, "Adding content provider requested by "+ - r.processName +" from process "+cpr.info.processName); r.conProviders.add(cpr); cpr.clients.add(r); } else { @@ -7526,8 +7524,6 @@ public final class ActivityManagerService extends ActivityManagerNative implemen mProvidersByName.put(name, cpr); if (r != null) { - if(true) Log.v(TAG, "Adding content provider requested by "+ - r.processName +" from process "+cpr.info.processName); r.conProviders.add(cpr); cpr.clients.add(r); } else { @@ -7583,7 +7579,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen ContentProviderRecord cpr = (ContentProviderRecord)mProvidersByName.get(name); if(cpr == null) { //remove from mProvidersByClass - if(true) Log.v(TAG, name+" content provider not found in providers list"); + if(localLOGV) Log.v(TAG, name+" content provider not found in providers list"); return; } final ProcessRecord r = getRecordForAppLocked(caller); @@ -7594,11 +7590,11 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } //update content provider record entry info ContentProviderRecord localCpr = (ContentProviderRecord) mProvidersByClass.get(cpr.info.name); - if(true) Log.v(TAG, "Removing content provider requested by "+ - r.processName+" from process "+localCpr.info.processName); - if(localCpr.app == r) { + if(localLOGV) Log.v(TAG, "Removing content provider requested by "+ + r.info.processName+" from process "+localCpr.appInfo.processName); + if(localCpr.appInfo.processName == r.info.processName) { //should not happen. taken care of as a local provider - if(true) Log.v(TAG, "local provider doing nothing Ignoring other names"); + if(localLOGV) Log.v(TAG, "local provider doing nothing Ignoring other names"); return; } else { localCpr.clients.remove(r); diff --git a/telephony/java/com/android/internal/telephony/SmsMessageBase.java b/telephony/java/com/android/internal/telephony/SmsMessageBase.java index e73039bbe21b..3f0213b8866d 100644 --- a/telephony/java/com/android/internal/telephony/SmsMessageBase.java +++ b/telephony/java/com/android/internal/telephony/SmsMessageBase.java @@ -383,7 +383,7 @@ public abstract class SmsMessageBase { * 2. [x@y][ ]/[body] */ String[] parts = messageBody.split("( /)|( )", 2); - if (parts.length < 1 || parts[0].indexOf('@') == -1) return; + if (parts.length < 1) return; emailFrom = parts[0]; emailBody = parts[1]; isEmail = true; diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index 4c958f6e8c5e..dab529ee63e7 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -46,6 +46,7 @@ import com.android.internal.telephony.CommandException; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.DataConnectionTracker; import com.android.internal.telephony.gsm.MccTable; +import com.android.internal.telephony.IccCard; import com.android.internal.telephony.PhoneProxy; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.TelephonyEventLog; @@ -443,6 +444,8 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { if (!mIsMinInfoReady) { mIsMinInfoReady = true; } + phone.getIccCard().broadcastIccStateChangedIntent(IccCard.INTENT_VALUE_ICC_IMSI, + null); } else { Log.w(LOG_TAG,"error parsing cdmaSubscription params num=" + cdmaSubscription.length); diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java index b98071028c69..e4c871630c63 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java @@ -150,6 +150,8 @@ public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestSh static final String HTTP_WML_TESTS_PREFIX = "/sdcard/android/layout_tests/http/tests/wml/"; + static final String DEFAULT_TEST_HOST = "android-browser-test.mtv.corp.google.com"; + static final String FORWARD_HOST_CONF = "/sdcard/drt_forward_host.txt"; private ForwardServer fs8000, fs8080, fs8443; private MyTestRecorder mResultRecorder; @@ -161,12 +163,7 @@ public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestSh public LayoutTestsAutoTest() { super("com.android.dumprendertree", TestShellActivity.class); - int addr = -1; - try { - addr = AdbUtils.resolve("android-browser-test.mtv.corp.google.com"); - } catch (IOException ioe) { - Log.e(LOGTAG, "failed to resolve server address.", ioe); - } + int addr = getForwardHostAddr(); if(addr != -1) { fs8000 = new ForwardServer(8000, addr, 8000); fs8080 = new ForwardServer(8080, addr, 8080); @@ -174,6 +171,38 @@ public class LayoutTestsAutoTest extends ActivityInstrumentationTestCase2<TestSh } } + private int getForwardHostAddr() { + int addr = -1; + String host = null; + File forwardHostConf = new File(FORWARD_HOST_CONF); + if (forwardHostConf.isFile()) { + BufferedReader hostReader = null; + try { + hostReader = new BufferedReader(new FileReader(forwardHostConf)); + host = hostReader.readLine(); + Log.v(LOGTAG, "read forward host from file: " + host); + } catch (IOException ioe) { + Log.v(LOGTAG, "cannot read forward host from file", ioe); + } finally { + if (hostReader != null) { + try { + hostReader.close(); + } catch (IOException ioe) { + // burn!!! + } + } + } + } + if (host == null || host.length() == 0) + host = DEFAULT_TEST_HOST; + try { + addr = AdbUtils.resolve(host); + } catch (IOException ioe) { + Log.e(LOGTAG, "failed to resolve server address", ioe); + } + return addr; + } + // This function writes the result of the layout test to // Am status so that it can be picked up from a script. private void passOrFailCallback(String file, boolean result) { |