Merge "Plug memory leak in Simple*Adapter, due to the misuse of a WeakHashMap. This removes an optimization but the benefit is not worth the memory leak. Bug: #2353474."
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 54e03759..fc72f9a 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -155,7 +155,7 @@
             new AtomicReference<AccountManagerService>();
 
     private static final boolean isDebuggableMonkeyBuild =
-            SystemProperties.getBoolean("ro.monkey", false)
+            SystemProperties.getBoolean("monkey.running", false)
                     && SystemProperties.getBoolean("ro.debuggable", false);
     private static final Account[] EMPTY_ACCOUNT_ARRAY = new Account[]{};
 
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 2ab5357..0fafe5d 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1314,7 +1314,7 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve a
-     * {@blink android.appwidget.AppWidgetManager} for accessing AppWidgets.
+     * {@link android.appwidget.AppWidgetManager} for accessing AppWidgets.
      *
      * @hide
      * @see #getSystemService
@@ -1323,7 +1323,7 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve an
-     * {@blink android.backup.IBackupManager IBackupManager} for communicating
+     * {@link android.backup.IBackupManager IBackupManager} for communicating
      * with the backup mechanism.
      * @hide
      * 
@@ -1333,7 +1333,7 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve a
-     * {@blink android.os.DropBox DropBox} instance for recording
+     * {@link android.os.DropBoxManager} instance for recording
      * diagnostic logs.
      * @see #getSystemService
      */
diff --git a/core/java/android/content/res/ColorStateList.java b/core/java/android/content/res/ColorStateList.java
index 453a83d3..70baaef 100644
--- a/core/java/android/content/res/ColorStateList.java
+++ b/core/java/android/content/res/ColorStateList.java
@@ -44,7 +44,7 @@
  * &lt;selector xmlns:android="http://schemas.android.com/apk/res/android"&gt;
  *   &lt;item android:state_focused="true" android:color="@color/testcolor1"/&gt;
  *   &lt;item android:state_pressed="true" android:state_enabled="false" android:color="@color/testcolor2" /&gt;
- *   &lt;item android:state_enabled="false" android:colore="@color/testcolor3" /&gt;
+ *   &lt;item android:state_enabled="false" android:color="@color/testcolor3" /&gt;
  *   &lt;item android:state_active="true" android:color="@color/testcolor4" /&gt;
  *   &lt;item android:color="@color/testcolor5"/&gt;
  * &lt;/selector&gt;
diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java
index 03542dd..9742b05 100644
--- a/core/java/android/os/MemoryFile.java
+++ b/core/java/android/os/MemoryFile.java
@@ -52,7 +52,7 @@
     private static native void native_write(FileDescriptor fd, int address, byte[] buffer,
             int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException;
     private static native void native_pin(FileDescriptor fd, boolean pin) throws IOException;
-    private static native int native_get_mapped_size(FileDescriptor fd) throws IOException;
+    private static native int native_get_size(FileDescriptor fd) throws IOException;
 
     private FileDescriptor mFD;        // ashmem file descriptor
     private int mAddress;   // address of ashmem memory
@@ -300,20 +300,19 @@
      * @hide
      */
     public static boolean isMemoryFile(FileDescriptor fd) throws IOException {
-        return (native_get_mapped_size(fd) >= 0);
+        return (native_get_size(fd) >= 0);
     }
 
     /**
-     * Returns the size of the memory file, rounded up to a page boundary, that
-     * the file descriptor refers to, or -1 if the file descriptor does not
-     * refer to a memory file.
+     * Returns the size of the memory file that the file descriptor refers to,
+     * or -1 if the file descriptor does not refer to a memory file.
      *
      * @throws IOException If <code>fd</code> is not a valid file descriptor.
      *
      * @hide
      */
-    public static int getMappedSize(FileDescriptor fd) throws IOException {
-        return native_get_mapped_size(fd);
+    public static int getSize(FileDescriptor fd) throws IOException {
+        return native_get_size(fd);
     }
 
     /**
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index ae53dbe2..964567a 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -179,6 +179,14 @@
     public final static String EXTRA_OUTPUT = "output";
 
     /**
+      * The string that is used when a media attribute is not known. For example,
+      * if an audio file does not have any meta data, the artist and album columns
+      * will be set to this value.
+      * @hide
+      */
+    public static final String UNKNOWN_STRING = "<unknown>";
+
+    /**
      * Common fields for most MediaProvider tables
      */
 
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index c4e26bc..22dca3a 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -56,6 +56,9 @@
     private static long CACHE_THRESHOLD = 6 * 1024 * 1024;
     private static long CACHE_TRIM_AMOUNT = 2 * 1024 * 1024;
 
+    // Limit the maximum cache file size to half of the normal capacity
+    static long CACHE_MAX_SIZE = (CACHE_THRESHOLD - CACHE_TRIM_AMOUNT) / 2;
+
     private static boolean mDisabled;
 
     // Reference count the enable/disable transaction
@@ -448,7 +451,6 @@
             return;
         }
 
-        cacheRet.contentLength = cacheRet.outFile.length();
         boolean redirect = checkCacheRedirect(cacheRet.httpStatusCode);
         if (redirect) {
             // location is in database, no need to keep the file
@@ -470,6 +472,15 @@
         }
     }
 
+    static boolean cleanupCacheFile(CacheResult cacheRet) {
+        try {
+            cacheRet.outStream.close();
+        } catch (IOException e) {
+            return false;
+        }
+        return cacheRet.outFile.delete();
+    }
+
     /**
      * remove all cache files
      * 
@@ -644,6 +655,9 @@
 
     private static CacheResult parseHeaders(int statusCode, Headers headers,
             String mimeType) {
+        // if the contentLength is already larger than CACHE_MAX_SIZE, skip it
+        if (headers.getContentLength() > CACHE_MAX_SIZE) return null;
+
         // TODO: if authenticated or secure, return null
         CacheResult ret = new CacheResult();
         ret.httpStatusCode = statusCode;
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index c2b9f20..cdc6608 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -936,8 +936,11 @@
     void downloadFile() {
         // Setting the Cache Result to null ensures that this
         // content is not added to the cache
-        mCacheResult = null;
-        
+        if (mCacheResult != null) {
+            CacheManager.cleanupCacheFile(mCacheResult);
+            mCacheResult = null;
+        }
+
         // Inform the client that they should download a file
         mBrowserFrame.getCallbackProxy().onDownloadStart(url(), 
                 mBrowserFrame.getUserAgentString(),
@@ -1096,10 +1099,18 @@
 
             if (c.mLength != 0) {
                 if (mCacheResult != null) {
-                    try {
-                        mCacheResult.outStream.write(c.mArray, 0, c.mLength);
-                    } catch (IOException e) {
+                    mCacheResult.contentLength += c.mLength;
+                    if (mCacheResult.contentLength > CacheManager.CACHE_MAX_SIZE) {
+                        CacheManager.cleanupCacheFile(mCacheResult);
                         mCacheResult = null;
+                    } else {
+                        try {
+                            mCacheResult.outStream
+                                    .write(c.mArray, 0, c.mLength);
+                        } catch (IOException e) {
+                            CacheManager.cleanupCacheFile(mCacheResult);
+                            mCacheResult = null;
+                        }
                     }
                 }
                 nativeAddData(c.mArray, c.mLength);
@@ -1117,6 +1128,8 @@
         if (mCacheResult != null) {
             if (getErrorID() == OK) {
                 CacheManager.saveCacheFile(mUrl, mPostIdentifier, mCacheResult);
+            } else {
+                CacheManager.cleanupCacheFile(mCacheResult);
             }
 
             // we need to reset mCacheResult to be null
@@ -1181,7 +1194,10 @@
             mRequestHandle = null;
         }
 
-        mCacheResult = null;
+        if (mCacheResult != null) {
+            CacheManager.cleanupCacheFile(mCacheResult);
+            mCacheResult = null;
+        }
         mCancelled = true;
 
         clearNativeLoader();
@@ -1246,6 +1262,8 @@
                 if (getErrorID() == OK) {
                     CacheManager.saveCacheFile(mUrl, mPostIdentifier,
                             mCacheResult);
+                } else {
+                    CacheManager.cleanupCacheFile(mCacheResult);
                 }
                 mCacheResult = null;
             }
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 92ff315..248ed03 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2969,7 +2969,7 @@
             break;
         case KeyEvent.KEYCODE_SPACE:
             // Only send spaces once we are filtered
-            okToSend = mFiltered = true;
+            okToSend = mFiltered;
             break;
         }
 
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e19a93d..533c607 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -45,8 +45,7 @@
 
 /**
  * A Layout where the positions of the children can be described in relation to each other or to the
- * parent. For the sake of efficiency, the relations between views are evaluated in one pass, so if
- * view Y is dependent on the position of view X, make sure the view X comes first in the layout.
+ * parent.
  *
  * <p>
  * Note that you cannot have a circular dependency between the size of the RelativeLayout and the
diff --git a/core/java/com/android/internal/net/DbSSLSessionCache.java b/core/java/com/android/internal/net/DbSSLSessionCache.java
deleted file mode 100644
index 842d40b..0000000
--- a/core/java/com/android/internal/net/DbSSLSessionCache.java
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2009 The Android Open Source Project
-
-package com.android.internal.net;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.net.ssl.SSLSession;
-
-/**
- * Hook into harmony SSL cache to persist the SSL sessions.
- * 
- * Current implementation is suitable for saving a small number of hosts -
- * like google services. It can be extended with expiration and more features
- * to support more hosts.  
- * 
- * {@hide}
- */
-public class DbSSLSessionCache implements SSLClientSessionCache {
-    private static final String TAG = "DbSSLSessionCache";
-
-    /** 
-     * Table where sessions are stored. 
-     */
-    public static final String SSL_CACHE_TABLE = "ssl_sessions";
-
-    private static final String SSL_CACHE_ID = "_id";
-    
-    /**
-     * Key is host:port - port is not optional.
-     */
-    private static final String SSL_CACHE_HOSTPORT = "hostport";
-    
-    /**
-     * Base64-encoded DER value of the session.
-     */
-    private static final String SSL_CACHE_SESSION = "session";
-    
-    /**
-     * Time when the record was added - should be close to the time 
-     * of the initial session negotiation.
-     */
-    private static final String SSL_CACHE_TIME_SEC = "time_sec";
-
-    public static final String DATABASE_NAME = "ssl_sessions.db";
-
-    public static final int DATABASE_VERSION = 2;
-    
-    /** public for testing 
-     */
-    public static final int SSL_CACHE_ID_COL = 0;
-    public static final int SSL_CACHE_HOSTPORT_COL = 1;
-    public static final int SSL_CACHE_SESSION_COL = 2;
-    public static final int SSL_CACHE_TIME_SEC_COL = 3;
-    
-    public static final int MAX_CACHE_SIZE = 256;
-    
-    private final Map<String, byte[]> mExternalCache =
-        new HashMap<String, byte[]>();
-        
-        
-    private DatabaseHelper mDatabaseHelper;
-
-    private boolean mNeedsCacheLoad = true;
-    
-    public static final String[] PROJECTION = new String[] {
-      SSL_CACHE_ID, 
-      SSL_CACHE_HOSTPORT,
-      SSL_CACHE_SESSION,
-      SSL_CACHE_TIME_SEC
-    };
-
-    private static final Map<String,DbSSLSessionCache> sInstances =
-            new HashMap<String,DbSSLSessionCache>();
-
-    /**
-     * Returns a singleton instance of the DbSSLSessionCache that should be used for this
-     * context's package.
-     *
-     * @param context The context that should be used for getting/creating the singleton instance.
-     * @return The singleton instance for the context's package.
-     */
-    public static synchronized DbSSLSessionCache getInstanceForPackage(Context context) {
-        String packageName = context.getPackageName();
-        if (sInstances.containsKey(packageName)) {
-            return sInstances.get(packageName);
-        }
-        DbSSLSessionCache cache = new DbSSLSessionCache(context);
-        sInstances.put(packageName, cache);
-        return cache;
-    }
-    
-    /**
-     * Create a SslSessionCache instance, using the specified context to 
-     * initialize the database.
-     * 
-     * This constructor will use the default database - created for the application
-     * context.
-     * 
-     * @param activityContext
-     */
-    private DbSSLSessionCache(Context activityContext) {
-        Context appContext = activityContext.getApplicationContext();
-        mDatabaseHelper = new DatabaseHelper(appContext);
-    }
-    
-    /**
-     * Create a SslSessionCache that uses a specific database.
-     * 
-     * 
-     * @param database
-     */
-    public DbSSLSessionCache(DatabaseHelper database) {
-        this.mDatabaseHelper = database;
-    }
-    
-    public void putSessionData(SSLSession session, byte[] der) {
-        if (mDatabaseHelper == null) {
-            return;
-        }
-        synchronized (this.getClass()) {
-            SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
-            if (mExternalCache.size() == MAX_CACHE_SIZE) {
-                // remove oldest.
-                // TODO: check if the new one is in cached already ( i.e. update ).
-                Cursor byTime = mDatabaseHelper.getReadableDatabase().query(SSL_CACHE_TABLE, 
-                        PROJECTION, null, null, null, null, SSL_CACHE_TIME_SEC);
-                if (byTime.moveToFirst()) {
-                    // TODO: can I do byTime.deleteRow() ? 
-                    String hostPort = byTime.getString(SSL_CACHE_HOSTPORT_COL);
-                    db.delete(SSL_CACHE_TABLE, 
-                            SSL_CACHE_HOSTPORT + "= ?" , new String[] { hostPort });
-                    mExternalCache.remove(hostPort);
-                } else {
-                    Log.w(TAG, "No rows found");
-                    // something is wrong, clear it
-                    clear();
-                }
-            }
-            // Serialize native session to standard DER encoding    
-            long t0 = System.currentTimeMillis();
-
-            String b64 = new String(Base64.encodeBase64(der));
-            String key = session.getPeerHost() + ":" + session.getPeerPort();
-
-            ContentValues values = new ContentValues();
-            values.put(SSL_CACHE_HOSTPORT, key);
-            values.put(SSL_CACHE_SESSION, b64);
-            values.put(SSL_CACHE_TIME_SEC, System.currentTimeMillis() / 1000);
-
-            mExternalCache.put(key, der);
-
-            try {
-                db.insert(SSL_CACHE_TABLE, null /*nullColumnHack */ , values);
-            } catch(SQLException ex) {
-                // Ignore - nothing we can do to recover, and caller shouldn't 
-                // be affected.
-                Log.w(TAG, "Ignoring SQL exception when caching session", ex);
-            }
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                long t1 = System.currentTimeMillis();
-                Log.d(TAG, "New SSL session " + session.getPeerHost() +
-                        " DER len: " + der.length + " " + (t1 - t0));
-            }
-        }
-
-    }
-
-    public byte[] getSessionData(String host, int port) {
-        // Current (simple) implementation does a single lookup to DB, then saves 
-        // all entries to the cache. 
-
-        // This works for google services - i.e. small number of certs.
-        // If we extend this to all processes - we should hold a separate cache 
-        // or do lookups to DB each time. 
-        if (mDatabaseHelper == null) {
-            return null;
-        }
-        synchronized(this.getClass()) {
-            if (mNeedsCacheLoad) {
-                // Don't try to load again, if something is wrong on the first 
-                // request it'll likely be wrong each time.
-                mNeedsCacheLoad = false;
-                long t0 = System.currentTimeMillis();
-
-                Cursor cur = null;
-                try {
-                    cur = mDatabaseHelper.getReadableDatabase().query(SSL_CACHE_TABLE, 
-                            PROJECTION, null, null, null, null, null);
-                    if (cur.moveToFirst()) {
-                        do {
-                            String hostPort = cur.getString(SSL_CACHE_HOSTPORT_COL);
-                            String value = cur.getString(SSL_CACHE_SESSION_COL);
-
-                            if (hostPort == null || value == null) {
-                                continue;
-                            }
-                            // TODO: blob support ?
-                            byte[] der = Base64.decodeBase64(value.getBytes());
-                            mExternalCache.put(hostPort, der);
-                        } while (cur.moveToNext());
-
-                    }
-                } catch (SQLException ex) {
-                    Log.d(TAG, "Error loading SSL cached entries ", ex);
-                } finally {
-                    if (cur != null) {
-                        cur.close();
-                    }
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        long t1 = System.currentTimeMillis();
-                        Log.d(TAG, "LOADED CACHED SSL " + (t1 - t0) + " ms");
-                    }
-                }
-            }
-
-            String key = host + ":" + port;
-
-            return mExternalCache.get(key);
-        }
-    }
-
-    /** 
-     * Reset the database and internal state. 
-     * Used for testing or to free space.
-     */
-    public void clear() {
-        synchronized(this) {
-            try {
-                mExternalCache.clear();
-                mNeedsCacheLoad = true;
-                mDatabaseHelper.getWritableDatabase().delete(SSL_CACHE_TABLE, 
-                        null, null);
-            } catch (SQLException ex) {
-                Log.d(TAG, "Error removing SSL cached entries ", ex);
-                // ignore - nothing we can do about it
-            }
-        } 
-    }
-
-    public byte[] getSessionData(byte[] id) {
-        // We support client side only - the cache will do nothing for 
-        // server-side sessions. 
-        return null;
-    }
-
-    /** Visible for testing. 
-     */
-    public static class DatabaseHelper extends SQLiteOpenHelper {
-
-        public DatabaseHelper(Context context) {
-            super(context, DATABASE_NAME, null /* factory */, DATABASE_VERSION);
-        }   
-
-        @Override
-        public void onCreate(SQLiteDatabase db) {
-            db.execSQL("CREATE TABLE " + SSL_CACHE_TABLE + " (" +
-                    SSL_CACHE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
-                    SSL_CACHE_HOSTPORT + " TEXT UNIQUE ON CONFLICT REPLACE," +
-                    SSL_CACHE_SESSION + " TEXT," +
-                    SSL_CACHE_TIME_SEC + " INTEGER" +
-            ");");
-            
-            // No index - we load on startup, index would slow down inserts.
-            // If we want to scale this to lots of rows - we could use 
-            // index, but then we'll hit DB a bit too often ( including 
-            // negative hits )
-        }
-
-        @Override
-        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-            db.execSQL("DROP TABLE IF EXISTS " + SSL_CACHE_TABLE );
-            onCreate(db);
-        }
-
-    }
-    
-}
diff --git a/core/java/com/google/android/net/NetworkStatsEntity.java b/core/java/com/google/android/net/NetworkStatsEntity.java
deleted file mode 100644
index a22fa1e..0000000
--- a/core/java/com/google/android/net/NetworkStatsEntity.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.
- */
-
-package com.google.android.net;
-
-import android.net.TrafficStats;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.util.EventLog;
-import org.apache.http.HttpEntity;
-import org.apache.http.entity.HttpEntityWrapper;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-public class NetworkStatsEntity extends HttpEntityWrapper {
-
-    private static final int HTTP_STATS_EVENT = 52001;
-
-    private class NetworkStatsInputStream extends FilterInputStream {
-
-        public NetworkStatsInputStream(InputStream wrapped) {
-            super(wrapped);
-        }
-
-        @Override
-        public void close() throws IOException {
-            try {
-                super.close();
-            } finally {
-                long processingTime = SystemClock.elapsedRealtime() - mProcessingStartTime;
-                long tx = TrafficStats.getUidTxBytes(mUid);
-                long rx = TrafficStats.getUidRxBytes(mUid);
-
-                EventLog.writeEvent(HTTP_STATS_EVENT, mUa, mResponseLatency, processingTime,
-                        tx - mStartTx, rx - mStartRx);
-            }
-        }
-    }
-
-    private final String mUa;
-    private final int mUid;
-    private final long mStartTx;
-    private final long mStartRx;
-    private final long mResponseLatency;
-    private final long mProcessingStartTime;
-
-    public NetworkStatsEntity(HttpEntity orig, String ua,
-            int uid, long startTx, long startRx, long responseLatency,
-            long processingStartTime) {
-        super(orig);
-        this.mUa = ua;
-        this.mUid = uid;
-        this.mStartTx = startTx;
-        this.mStartRx = startRx;
-        this.mResponseLatency = responseLatency;
-        this.mProcessingStartTime = processingStartTime;
-    }
-
-    public static boolean shouldLogNetworkStats() {
-      return "1".equals(SystemProperties.get("googlehttpclient.logstats"));
-    }
-
-    @Override
-    public InputStream getContent() throws IOException {
-        InputStream orig = super.getContent();
-        return new NetworkStatsInputStream(orig);
-    }
-}
diff --git a/core/java/com/google/android/net/SSLClientSessionCacheFactory.java b/core/java/com/google/android/net/SSLClientSessionCacheFactory.java
deleted file mode 100644
index 6570a9bd..0000000
--- a/core/java/com/google/android/net/SSLClientSessionCacheFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.google.android.net;
-
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-import org.apache.harmony.xnet.provider.jsse.FileClientSessionCache;
-import android.content.Context;
-import android.provider.Settings;
-import android.util.Log;
-
-import java.io.File;
-import java.io.IOException;
-
-import com.android.internal.net.DbSSLSessionCache;
-
-/**
- * Factory that returns the appropriate implementation of a {@link SSLClientSessionCache} based
- * on gservices.
- *
- * @hide
- */
-// TODO: return a proxied implementation that is updated as the gservices value changes.
-public final class SSLClientSessionCacheFactory {
-
-    private static final String TAG = "SSLClientSessionCacheFactory";
-
-    public static final String DB = "db";
-    public static final String FILE = "file";
-
-    // utility class
-    private SSLClientSessionCacheFactory() {}
-
-    /**
-     * Returns a new {@link SSLClientSessionCache} based on the persistent cache that's specified,
-     * if any, in gservices.  If no cache is specified, returns null.
-     * @param context The application context used for the per-process persistent cache.
-     * @return A new {@link SSLClientSessionCache}, or null if no persistent cache is configured.
-     */
-    public static SSLClientSessionCache getCache(Context context) {
-        String type = Settings.Gservices.getString(context.getContentResolver(),
-                Settings.Gservices.SSL_SESSION_CACHE);
-
-        if (type != null) {
-            if (DB.equals(type)) {
-                return DbSSLSessionCache.getInstanceForPackage(context);
-            } else if (FILE.equals(type)) {
-                File dir = context.getFilesDir();
-                File cacheDir = new File(dir, "sslcache");
-                if (!cacheDir.exists()) {
-                    cacheDir.mkdir();
-                }
-                try {
-                    return FileClientSessionCache.usingDirectory(cacheDir);
-                } catch (IOException ioe) {
-                    Log.w(TAG, "Unable to create FileClientSessionCache in " + cacheDir.getName(), ioe);
-                    return null;
-                }
-            } else {
-                Log.w(TAG, "Ignoring unrecognized type: '" + type + "'");       
-            }
-        }
-        return null;
-    }
-}
diff --git a/core/java/com/google/android/net/UrlRules.java b/core/java/com/google/android/net/UrlRules.java
deleted file mode 100644
index 54d139d..0000000
--- a/core/java/com/google/android/net/UrlRules.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.net;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.provider.Checkin;
-import android.provider.Settings;
-import android.util.Config;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A set of rules rewriting and blocking URLs.  Used to offer a point of
- * control for redirecting HTTP requests, often to the Android proxy server.
- *
- * <p>Each rule has the following format:
- *
- * <pre><em>url-prefix</em> [REWRITE <em>new-prefix</em>] [BLOCK]</pre>
- *
- * <p>Any URL which starts with <em>url-prefix</em> will trigger the rule.
- * If BLOCK is specified, requests to that URL will be blocked and fail.
- * If REWRITE is specified, the matching prefix will be removed and replaced
- * with <em>new-prefix</em>.  (If both are specified, BLOCK wins.)  Case is
- * insensitive for the REWRITE and BLOCK keywords, but sensitive for URLs.
- *
- * <p>In Gservices, the value of any key that starts with "url:" will be
- * interpreted as a rule.  The full name of the key is unimportant (but can
- * be used to document the intent of the rule, and must be unique).
- * Example gservices keys:
- *
- * <pre>
- * url:use_proxy_for_calendar = "http://www.google.com/calendar/ REWRITE http://android.clients.google.com/proxy/calendar/"
- * url:stop_crash_reports = "http://android.clients.google.com/crash/ BLOCK"
- * url:use_ssl_for_contacts = "http://www.google.com/m8/ REWRITE https://www.google.com/m8/"
- * </pre>
- */
-public class UrlRules {
-    public static final String TAG = "UrlRules";
-    public static final boolean LOCAL_LOGV = Config.LOGV || false;
-
-    /** Thrown when the rewrite rules can't be parsed. */
-    public static class RuleFormatException extends Exception {
-        public RuleFormatException(String msg) { super(msg); }
-    }
-
-    /** A single rule specifying actions for URLs matching a certain prefix. */
-    public static class Rule implements Comparable {
-        /** Name assigned to the rule (for logging and debugging). */
-        public final String mName;
-
-        /** Prefix required to match this rule. */
-        public final String mPrefix;
-
-        /** Text to replace mPrefix with (null to leave alone). */
-        public final String mRewrite;
-
-        /** True if matching URLs should be blocked. */
-        public final boolean mBlock;
-
-        /** Default rule that does nothing. */
-        public static final Rule DEFAULT = new Rule();
-
-        /** Parse a rewrite rule as given in a Gservices value. */
-        public Rule(String name, String rule) throws RuleFormatException {
-            mName = name;
-            String[] words = PATTERN_SPACE_PLUS.split(rule);
-            if (words.length == 0) throw new RuleFormatException("Empty rule");
-
-            mPrefix = words[0];
-            String rewrite = null;
-            boolean block = false;
-            for (int pos = 1; pos < words.length; ) {
-                String word = words[pos].toLowerCase();
-                if (word.equals("rewrite") && pos + 1 < words.length) {
-                    rewrite = words[pos + 1];
-                    pos += 2;
-                } else if (word.equals("block")) {
-                    block = true;
-                    pos += 1;
-                } else {
-                    throw new RuleFormatException("Illegal rule: " + rule);
-                }
-                // TODO: Parse timeout specifications, etc.
-            }
-
-            mRewrite = rewrite;
-            mBlock = block;
-        }
-
-        /** Create the default Rule. */
-        private Rule() {
-            mName = "DEFAULT";
-            mPrefix = "";
-            mRewrite = null;
-            mBlock = false;
-        }
-
-        /**
-         * Apply the rule to a particular URL (assumed to match the rule).
-         * @param url to rewrite or modify.
-         * @return modified URL, or null if the URL is blocked.
-         */
-         public String apply(String url) {
-             if (mBlock) {
-                 return null;
-             } else if (mRewrite != null) {
-                 return mRewrite + url.substring(mPrefix.length());
-             } else {
-                 return url;
-             }
-         }
-
-         /** More generic rules are greater than more specific rules. */
-         public int compareTo(Object o) {
-             return ((Rule) o).mPrefix.compareTo(mPrefix);
-         }
-    }
-
-    /** Cached rule set from Gservices. */
-    private static UrlRules sCachedRules = new UrlRules(new Rule[] {});
-
-    private static final Pattern PATTERN_SPACE_PLUS = Pattern.compile(" +");
-    private static final Pattern RULE_PATTERN = Pattern.compile("\\W");
-
-    /** Gservices digest when sCachedRules was cached. */
-    private static String sCachedDigest = null;
-
-    /** Currently active set of Rules. */
-    private final Rule[] mRules;
-
-    /** Regular expression with one capturing group for each Rule. */
-    private final Pattern mPattern;
-
-    /**
-     * Create a rewriter from an array of Rules.  Normally used only for
-     * testing.  Instead, use {@link #getRules} to get rules from Gservices.
-     * @param rules to use.
-     */
-    public UrlRules(Rule[] rules) {
-        // Sort the rules to put the most specific rules first.
-        Arrays.sort(rules);
-
-        // Construct a regular expression, escaping all the prefix strings.
-        StringBuilder pattern = new StringBuilder("(");
-        for (int i = 0; i < rules.length; ++i) {
-            if (i > 0) pattern.append(")|(");
-            pattern.append(RULE_PATTERN.matcher(rules[i].mPrefix).replaceAll("\\\\$0"));
-        }
-        mPattern = Pattern.compile(pattern.append(")").toString());
-        mRules = rules;
-    }
-
-    /**
-     * Match a string against every Rule and find one that matches.
-     * @param uri to match against the Rules in the rewriter.
-     * @return the most specific matching Rule, or Rule.DEFAULT if none match.
-     */
-    public Rule matchRule(String url) {
-        Matcher matcher = mPattern.matcher(url);
-        if (matcher.lookingAt()) {
-            for (int i = 0; i < mRules.length; ++i) {
-                if (matcher.group(i + 1) != null) {
-                    return mRules[i];  // Rules are sorted most specific first.
-                }
-            }
-        }
-        return Rule.DEFAULT;
-    }
-
-    /**
-     * Get the (possibly cached) UrlRules based on the rules in Gservices.
-     * @param resolver to use for accessing the Gservices database.
-     * @return an updated UrlRules instance
-     */
-    public static synchronized UrlRules getRules(ContentResolver resolver) {
-        String digest = Settings.Gservices.getString(resolver,
-                Settings.Gservices.PROVISIONING_DIGEST);
-        if (sCachedDigest != null && sCachedDigest.equals(digest)) {
-            // The digest is the same, so the rules are the same.
-            if (LOCAL_LOGV) Log.v(TAG, "Using cached rules for digest: " + digest);
-            return sCachedRules;
-        }
-
-        if (LOCAL_LOGV) Log.v(TAG, "Scanning for Gservices \"url:*\" rules");
-        Cursor cursor = resolver.query(Settings.Gservices.CONTENT_URI,
-                new String[] {
-                    Settings.Gservices.NAME,
-                    Settings.Gservices.VALUE
-                },
-                Settings.Gservices.NAME + " like \"url:%\"", null,
-                Settings.Gservices.NAME);
-        try {
-            ArrayList<Rule> rules = new ArrayList<Rule>();
-            while (cursor.moveToNext()) {
-                try {
-                    String name = cursor.getString(0).substring(4);  // "url:X"
-                    String value = cursor.getString(1);
-                    if (value == null || value.length() == 0) continue;
-                    if (LOCAL_LOGV) Log.v(TAG, "  Rule " + name + ": " + value);
-                    rules.add(new Rule(name, value));
-                } catch (RuleFormatException e) {
-                    // Oops, Gservices has an invalid rule!  Skip it.
-                    Log.e(TAG, "Invalid rule from Gservices", e);
-                    Checkin.logEvent(resolver,
-                        Checkin.Events.Tag.GSERVICES_ERROR, e.toString());
-                }
-            }
-            sCachedRules = new UrlRules(rules.toArray(new Rule[rules.size()]));
-            sCachedDigest = digest;
-            if (LOCAL_LOGV) Log.v(TAG, "New rules stored for digest: " + digest);
-        } finally {
-            cursor.close();
-        }
-
-        return sCachedRules;
-    }
-}
diff --git a/core/jni/android_os_MemoryFile.cpp b/core/jni/android_os_MemoryFile.cpp
index 1ae3ec7..ee8d836 100644
--- a/core/jni/android_os_MemoryFile.cpp
+++ b/core/jni/android_os_MemoryFile.cpp
@@ -30,8 +30,6 @@
 {
     const char* namestr = (name ? env->GetStringUTFChars(name, NULL) : NULL);
 
-    // round up length to page boundary
-    length = (((length - 1) / getpagesize()) + 1) * getpagesize();
     int result = ashmem_create_region(namestr, length);
 
     if (name)
@@ -118,7 +116,7 @@
     }
 }
 
-static jint android_os_MemoryFile_get_mapped_size(JNIEnv* env, jobject clazz,
+static jint android_os_MemoryFile_get_size(JNIEnv* env, jobject clazz,
         jobject fileDescriptor) {
     int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
     // Use ASHMEM_GET_SIZE to find out if the fd refers to an ashmem region.
@@ -146,8 +144,8 @@
     {"native_read",  "(Ljava/io/FileDescriptor;I[BIIIZ)I", (void*)android_os_MemoryFile_read},
     {"native_write", "(Ljava/io/FileDescriptor;I[BIIIZ)V", (void*)android_os_MemoryFile_write},
     {"native_pin",   "(Ljava/io/FileDescriptor;Z)V", (void*)android_os_MemoryFile_pin},
-    {"native_get_mapped_size", "(Ljava/io/FileDescriptor;)I",
-            (void*)android_os_MemoryFile_get_mapped_size}
+    {"native_get_size", "(Ljava/io/FileDescriptor;)I",
+            (void*)android_os_MemoryFile_get_size}
 };
 
 static const char* const kClassPathName = "android/os/MemoryFile";
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index f60a7be..3c03eed 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -532,7 +532,7 @@
     public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
         try {
             if (MemoryFile.isMemoryFile(fd)) {
-                int mappedlength = MemoryFile.getMappedSize(fd);
+                int mappedlength = MemoryFile.getSize(fd);
                 MemoryFile file = new MemoryFile(fd, mappedlength, "r");
                 InputStream is = file.getInputStream();
                 Bitmap bm = decodeStream(is, outPadding, opts);
diff --git a/preloaded-classes b/preloaded-classes
index f695f4e..c50b36e 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -691,8 +691,6 @@
 com.google.android.mms.pdu.CharacterSets
 com.google.android.mms.pdu.PduPart
 com.google.android.mms.pdu.PduPersister
-com.google.android.net.UrlRules
-com.google.android.net.UrlRules$Rule
 com.ibm.icu4jni.charset.CharsetDecoderICU
 com.ibm.icu4jni.charset.CharsetEncoderICU
 com.ibm.icu4jni.charset.CharsetICU
diff --git a/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java b/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java
deleted file mode 100644
index cf759e0..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/ApacheHttpTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.android.unit_tests;
-
-import junit.framework.TestSuite;
-
-public class ApacheHttpTests {
-    public static TestSuite suite() {
-        TestSuite suite = new TestSuite(ApacheHttpTests.class.getName());
-
-        suite.addTestSuite(TestHttpService.class);
-
-        return suite;
-    }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java b/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java
deleted file mode 100644
index 5d7349f..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/SSLClientSessionCacheFactoryTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.android.unit_tests;
-
-import com.google.android.net.SSLClientSessionCacheFactory;
-import com.android.internal.net.DbSSLSessionCache;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
-
-/**
- *  Unit test for {@link SSLClientSessionCacheFactory}.
- */
-@MediumTest
-public final class SSLClientSessionCacheFactoryTest extends AndroidTestCase {
-
-    protected void tearDown() throws Exception {
-        setSslSessionCacheValue(getContext(), "");
-        super.tearDown();
-    }
-
-    private static void setSslSessionCacheValue(Context context, String value) {
-        ContentResolver resolver = context.getContentResolver();
-        Settings.Gservices.putString(resolver, Settings.Gservices.SSL_SESSION_CACHE, value);
-    }
-
-    private static SSLClientSessionCache getCache(Context context, String type) {
-        setSslSessionCacheValue(context, type);
-        return SSLClientSessionCacheFactory.getCache(context);
-    }
-
-    public void testGetDbCache() throws Exception {
-        Context context = getContext();
-        SSLClientSessionCache cache = getCache(context, "db");
-        assertNotNull(cache);
-        assertTrue(cache instanceof DbSSLSessionCache);
-    }
-
-    public void testGetFileCache() throws Exception {
-        Context context = getContext();
-        SSLClientSessionCache cache = getCache(context, "file");
-        assertNotNull(cache);
-        // yuck =)
-        assertEquals("org.apache.harmony.xnet.provider.jsse.FileClientSessionCache$Impl",
-                cache.getClass().getName());
-    }
-
-    public void testGetNoCache() throws Exception {
-        Context context = getContext();
-        SSLClientSessionCache cache = getCache(context, "none");
-        assertNull(cache);
-    }
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java b/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java
deleted file mode 100644
index aae21b3..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/TestHttpServer.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/jakarta/httpcomponents/httpcore/tags/4.0-alpha6/module-main/src/test/java/org/apache/http/mockup/TestHttpServer.java $
- * $Revision: 576077 $
- * $Date: 2007-09-16 04:50:22 -0700 (Sun, 16 Sep 2007) $
- *
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package com.android.unit_tests;
-
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.ConnectionReuseStrategy;
-import org.apache.http.HttpException;
-import org.apache.http.HttpResponseFactory;
-import org.apache.http.HttpServerConnection;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.DefaultHttpServerConnection;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.CoreConnectionPNames;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpExpectationVerifier;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpRequestHandlerRegistry;
-import org.apache.http.protocol.HttpService;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
-
-public class TestHttpServer {
-
-    private final HttpParams params; 
-    private final BasicHttpProcessor httpproc;
-    private final ConnectionReuseStrategy connStrategy;
-    private final HttpResponseFactory responseFactory;
-    private final HttpRequestHandlerRegistry reqistry;
-    private final ServerSocket serversocket;
-    
-    private HttpExpectationVerifier expectationVerifier;
-    
-    private Thread listener;
-    private volatile boolean shutdown;
-    
-    public TestHttpServer() throws IOException {
-        super();
-        this.params = new BasicHttpParams();
-        this.params
-            .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 20000)
-            .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
-            .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
-            .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
-            .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "TEST-SERVER/1.1");
-        this.httpproc = new BasicHttpProcessor();
-        this.httpproc.addInterceptor(new ResponseDate());
-        this.httpproc.addInterceptor(new ResponseServer());
-        this.httpproc.addInterceptor(new ResponseContent());
-        this.httpproc.addInterceptor(new ResponseConnControl());
-        this.connStrategy = new DefaultConnectionReuseStrategy();
-        this.responseFactory = new DefaultHttpResponseFactory();
-        this.reqistry = new HttpRequestHandlerRegistry();
-        this.serversocket = new ServerSocket(0);
-    }
-    
-    public void registerHandler(
-            final String pattern, 
-            final HttpRequestHandler handler) {
-        this.reqistry.register(pattern, handler);
-    }
-    
-    public void setExpectationVerifier(final HttpExpectationVerifier expectationVerifier) {
-        this.expectationVerifier = expectationVerifier;
-    }
-    
-    private HttpServerConnection acceptConnection() throws IOException {
-        Socket socket = this.serversocket.accept();
-        DefaultHttpServerConnection conn = new DefaultHttpServerConnection();
-        conn.bind(socket, this.params);
-        return conn;
-    }
-    
-    public int getPort() {
-        return this.serversocket.getLocalPort();
-    }
-    
-    public InetAddress getInetAddress() {
-        return this.serversocket.getInetAddress();
-    }
-    
-    public void start() {
-        if (this.listener != null) {
-            throw new IllegalStateException("Listener already running");
-        }
-        this.listener = new Thread(new Runnable() {
-           
-            public void run() {
-                while (!shutdown && !Thread.interrupted()) {
-                    try {
-                        // Set up HTTP connection
-                        HttpServerConnection conn = acceptConnection();
-                        // Set up the HTTP service
-                        HttpService httpService = new HttpService(
-                                httpproc, 
-                                connStrategy,
-                                responseFactory);
-                        httpService.setParams(params);
-                        httpService.setExpectationVerifier(expectationVerifier);
-                        httpService.setHandlerResolver(reqistry);
-                        
-                        // Start worker thread
-                        Thread t = new WorkerThread(httpService, conn);
-                        t.setDaemon(true);
-                        t.start();
-                    } catch (InterruptedIOException ex) {
-                        break;
-                    } catch (IOException e) {
-                        break;
-                    }
-                }
-            }
-            
-        });
-        this.listener.start();
-    }
-
-    public void shutdown() {
-        if (this.shutdown) {
-            return;
-        }
-        this.shutdown = true;
-        try {
-            this.serversocket.close();
-        } catch (IOException ignore) {}
-        this.listener.interrupt();
-        try {
-            this.listener.join(1000);
-        } catch (InterruptedException ignore) {}
-    }
-    
-    static class WorkerThread extends Thread {
-
-        private final HttpService httpservice;
-        private final HttpServerConnection conn;
-        
-        public WorkerThread(
-                final HttpService httpservice, 
-                final HttpServerConnection conn) {
-            super();
-            this.httpservice = httpservice;
-            this.conn = conn;
-        }
-        
-        public void run() {
-            HttpContext context = new BasicHttpContext(null);
-            try {
-                while (!Thread.interrupted() && this.conn.isOpen()) {
-                    this.httpservice.handleRequest(this.conn, context);
-                }
-            } catch (ConnectionClosedException ex) {
-            } catch (IOException ex) {
-                System.err.println("I/O error: " + ex.getMessage());
-            } catch (HttpException ex) {
-                System.err.println("Unrecoverable HTTP protocol violation: " + ex.getMessage());
-            } finally {
-                try {
-                    this.conn.shutdown();
-                } catch (IOException ignore) {}
-            }
-        }
-
-    }
-    
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java b/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java
deleted file mode 100644
index 6b57d13..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/TestHttpService.java
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/jakarta/httpcomponents/httpcore/tags/4.0-alpha6/module-main/src/test/java/org/apache/http/protocol/TestHttpServiceAndExecutor.java $
- * $Revision: 576073 $
- * $Date: 2007-09-16 03:53:13 -0700 (Sun, 16 Sep 2007) $
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package com.android.unit_tests;
-
-import org.apache.http.protocol.HttpExpectationVerifier;
-import org.apache.http.protocol.HttpRequestHandler;
-import android.test.PerformanceTestCase;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import junit.framework.TestCase;
-
-import org.apache.http.Header;
-import org.apache.http.HttpConnectionMetrics;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.DefaultHttpClientConnection;
-import org.apache.http.message.BasicHttpEntityEnclosingRequest;
-import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.EncodingUtils;
-import org.apache.http.util.EntityUtils;
-
-
-import java.io.IOException;
-import java.net.Socket;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class TestHttpService extends TestCase implements PerformanceTestCase {
-
-    public boolean isPerformanceOnly() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    public int startPerformance(Intermediates intermediates) {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-    
-    private TestHttpServer server;
-    private TestHttpClient client;
-    
-    protected void setUp() throws Exception {
-        this.server = new TestHttpServer();
-        this.client = new TestHttpClient();
-    }
-
-    protected void tearDown() throws Exception {
-        if (server != null) {
-          this.server.shutdown();
-        }
-    }    
-   
-    /**
-     * This test case executes a series of simple GET requests 
-     */
-    @LargeTest
-    public void testSimpleBasicHttpRequests() throws Exception {
-        
-        int reqNo = 20;
-        
-        Random rnd = new Random();
-        
-        // Prepare some random data
-        final List testData = new ArrayList(reqNo);
-        for (int i = 0; i < reqNo; i++) {
-            int size = rnd.nextInt(5000);
-            byte[] data = new byte[size];
-            rnd.nextBytes(data);
-            testData.add(data);
-        }
-
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                String s = request.getRequestLine().getUri();
-                if (s.startsWith("/?")) {
-                    s = s.substring(2);
-                }
-                int index = Integer.parseInt(s);
-                byte[] data = (byte []) testData.get(index);
-                ByteArrayEntity entity = new ByteArrayEntity(data); 
-                response.setEntity(entity);
-            }
-            
-        });
-        
-        this.server.start();
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpRequest get = new BasicHttpRequest("GET", "/?" + r);
-                HttpResponse response = this.client.execute(get, host, conn);
-                byte[] received = EntityUtils.toByteArray(response.getEntity());
-                byte[] expected = (byte[]) testData.get(r);
-                
-                assertEquals(expected.length, received.length);
-                for (int i = 0; i < expected.length; i++) {
-                    assertEquals(expected[i], received[i]);
-                }
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-            
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-
-    /**
-     * This test case executes a series of simple POST requests with content length 
-     * delimited content. 
-     */
-    @LargeTest
-    public void testSimpleHttpPostsWithContentLength() throws Exception {
-        
-        int reqNo = 20;
-        
-        Random rnd = new Random();
-        
-        // Prepare some random data
-        List testData = new ArrayList(reqNo);
-        for (int i = 0; i < reqNo; i++) {
-            int size = rnd.nextInt(5000);
-            byte[] data = new byte[size];
-            rnd.nextBytes(data);
-            testData.add(data);
-        }
-
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                if (request instanceof HttpEntityEnclosingRequest) {
-                    HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
-                    byte[] data = EntityUtils.toByteArray(incoming);
-                    
-                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                    outgoing.setChunked(false);
-                    response.setEntity(outgoing);
-                } else {
-                    StringEntity outgoing = new StringEntity("No content"); 
-                    response.setEntity(outgoing);
-                }
-            }
-            
-        });
-        
-        this.server.start();
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
-                byte[] data = (byte[]) testData.get(r);
-                ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                post.setEntity(outgoing);
-
-                HttpResponse response = this.client.execute(post, host, conn);
-                byte[] received = EntityUtils.toByteArray(response.getEntity());
-                byte[] expected = (byte[]) testData.get(r);
-                
-                assertEquals(expected.length, received.length);
-                for (int i = 0; i < expected.length; i++) {
-                    assertEquals(expected[i], received[i]);
-                }
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-            
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-
-    /**
-     * This test case executes a series of simple POST requests with chunk 
-     * coded content content. 
-     */
-    @LargeTest
-    public void testSimpleHttpPostsChunked() throws Exception {
-        
-        int reqNo = 20;
-        
-        Random rnd = new Random();
-        
-        // Prepare some random data
-        List testData = new ArrayList(reqNo);
-        for (int i = 0; i < reqNo; i++) {
-            int size = rnd.nextInt(20000);
-            byte[] data = new byte[size];
-            rnd.nextBytes(data);
-            testData.add(data);
-        }
-
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                if (request instanceof HttpEntityEnclosingRequest) {
-                    HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
-                    byte[] data = EntityUtils.toByteArray(incoming);
-                    
-                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                    outgoing.setChunked(true);
-                    response.setEntity(outgoing);
-                } else {
-                    StringEntity outgoing = new StringEntity("No content"); 
-                    response.setEntity(outgoing);
-                }
-            }
-            
-        });
-        
-        this.server.start();
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
-                byte[] data = (byte[]) testData.get(r);
-                ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                outgoing.setChunked(true);
-                post.setEntity(outgoing);
-
-                HttpResponse response = this.client.execute(post, host, conn);
-                byte[] received = EntityUtils.toByteArray(response.getEntity());
-                byte[] expected = (byte[]) testData.get(r);
-                
-                assertEquals(expected.length, received.length);
-                for (int i = 0; i < expected.length; i++) {
-                    assertEquals(expected[i], received[i]);
-                }
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-
-    /**
-     * This test case executes a series of simple HTTP/1.0 POST requests. 
-     */
-    @LargeTest
-    public void testSimpleHttpPostsHTTP10() throws Exception {
-        
-        int reqNo = 20;
-        
-        Random rnd = new Random();
-        
-        // Prepare some random data
-        List testData = new ArrayList(reqNo);
-        for (int i = 0; i < reqNo; i++) {
-            int size = rnd.nextInt(5000);
-            byte[] data = new byte[size];
-            rnd.nextBytes(data);
-            testData.add(data);
-        }
-
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                if (request instanceof HttpEntityEnclosingRequest) {
-                    HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
-                    byte[] data = EntityUtils.toByteArray(incoming);
-                    
-                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                    outgoing.setChunked(false);
-                    response.setEntity(outgoing);
-                } else {
-                    StringEntity outgoing = new StringEntity("No content"); 
-                    response.setEntity(outgoing);
-                }
-            }
-            
-        });
-        
-        this.server.start();
-        
-        // Set protocol level to HTTP/1.0
-        this.client.getParams().setParameter(
-                CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
-                byte[] data = (byte[]) testData.get(r);
-                ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                post.setEntity(outgoing);
-
-                HttpResponse response = this.client.execute(post, host, conn);
-                assertEquals(HttpVersion.HTTP_1_0, response.getStatusLine().getProtocolVersion());
-                byte[] received = EntityUtils.toByteArray(response.getEntity());
-                byte[] expected = (byte[]) testData.get(r);
-                
-                assertEquals(expected.length, received.length);
-                for (int i = 0; i < expected.length; i++) {
-                    assertEquals(expected[i], received[i]);
-                }
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-
-    /**
-     * This test case executes a series of simple POST requests using 
-     * the 'expect: continue' handshake. 
-     */
-    @LargeTest
-    public void testHttpPostsWithExpectContinue() throws Exception {
-        
-        int reqNo = 20;
-        
-        Random rnd = new Random();
-        
-        // Prepare some random data
-        List testData = new ArrayList(reqNo);
-        for (int i = 0; i < reqNo; i++) {
-            int size = rnd.nextInt(5000);
-            byte[] data = new byte[size];
-            rnd.nextBytes(data);
-            testData.add(data);
-        }
-
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                if (request instanceof HttpEntityEnclosingRequest) {
-                    HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
-                    byte[] data = EntityUtils.toByteArray(incoming);
-                    
-                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                    outgoing.setChunked(true);
-                    response.setEntity(outgoing);
-                } else {
-                    StringEntity outgoing = new StringEntity("No content"); 
-                    response.setEntity(outgoing);
-                }
-            }
-            
-        });
-        
-        this.server.start();
-        
-        // Activate 'expect: continue' handshake
-        this.client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
-                byte[] data = (byte[]) testData.get(r);
-                ByteArrayEntity outgoing = new ByteArrayEntity(data);
-                outgoing.setChunked(true);
-                post.setEntity(outgoing);
-
-                HttpResponse response = this.client.execute(post, host, conn);
-                byte[] received = EntityUtils.toByteArray(response.getEntity());
-                byte[] expected = (byte[]) testData.get(r);
-                
-                assertEquals(expected.length, received.length);
-                for (int i = 0; i < expected.length; i++) {
-                    assertEquals(expected[i], received[i]);
-                }
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-    
-    
-    /**
-     * This test case executes a series of simple POST requests that do not 
-     * meet the target server expectations. 
-     */
-    @LargeTest
-    public void testHttpPostsWithExpectationVerification() throws Exception {
-        
-        int reqNo = 3;
-        
-        // Initialize the server-side request handler
-        this.server.registerHandler("*", new HttpRequestHandler() {
-
-            public void handle(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException, IOException {
-                
-                StringEntity outgoing = new StringEntity("No content"); 
-                response.setEntity(outgoing);
-            }
-            
-        });
-        
-        this.server.setExpectationVerifier(new HttpExpectationVerifier() {
-
-            public void verify(
-                    final HttpRequest request, 
-                    final HttpResponse response, 
-                    final HttpContext context) throws HttpException {
-                Header someheader = request.getFirstHeader("Secret");
-                if (someheader != null) {
-                    int secretNumber;
-                    try {
-                        secretNumber = Integer.parseInt(someheader.getValue());
-                    } catch (NumberFormatException ex) {
-                        response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
-                        return;
-                    }
-                    if (secretNumber < 2) {
-                        response.setStatusCode(HttpStatus.SC_EXPECTATION_FAILED);
-                        ByteArrayEntity outgoing = new ByteArrayEntity(
-                                EncodingUtils.getAsciiBytes("Wrong secret number")); 
-                        response.setEntity(outgoing);
-                    }
-                }
-            }
-            
-        });
-        
-        this.server.start();
-        
-        // Activate 'expect: continue' handshake
-        this.client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
-        
-        DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
-        HttpHost host = new HttpHost("localhost", this.server.getPort());
-        
-        try {
-            for (int r = 0; r < reqNo; r++) {
-                if (!conn.isOpen()) {
-                    Socket socket = new Socket(host.getHostName(), host.getPort());
-                    conn.bind(socket, this.client.getParams());
-                }
-                
-                BasicHttpEntityEnclosingRequest post = new BasicHttpEntityEnclosingRequest("POST", "/");
-                post.addHeader("Secret", Integer.toString(r));
-                ByteArrayEntity outgoing = new ByteArrayEntity(
-                        EncodingUtils.getAsciiBytes("No content")); 
-                post.setEntity(outgoing);
-
-                HttpResponse response = this.client.execute(post, host, conn);
-
-                HttpEntity entity = response.getEntity();
-                assertNotNull(entity);
-                entity.consumeContent();
-                
-                if (r < 2) {
-                    assertEquals(HttpStatus.SC_EXPECTATION_FAILED, response.getStatusLine().getStatusCode());
-                } else {
-                    assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
-                }
-                
-                if (!this.client.keepAlive(response)) {
-                    conn.close();
-                }
-            }
-            //Verify the connection metrics
-            HttpConnectionMetrics cm = conn.getMetrics();
-            assertEquals(reqNo, cm.getRequestCount());
-            assertEquals(reqNo, cm.getResponseCount());
-        } finally {
-            conn.close();
-            this.server.shutdown();
-        }
-    }
-    
-}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java b/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java
deleted file mode 100644
index a7c19a7..0000000
--- a/tests/AndroidTests/src/com/android/unit_tests/UrlRulesTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.unit_tests;
-
-import android.content.ContentResolver;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.google.android.net.UrlRules;
-import static com.google.android.net.UrlRules.Rule;
-
-/** Test loading and matching URL rewrite rules for UrlRules.  */
-public class UrlRulesTest extends AndroidTestCase {
-    @SmallTest
-    public void testEmptyRules() {
-        UrlRules rules = new UrlRules(new Rule[] { });
-        assertTrue(rules.matchRule("http://foo.bar/") == Rule.DEFAULT);
-    }
-
-    @SmallTest
-    public void testInvalidRule() throws Exception {
-        try {
-            new Rule("rule", "foo bar");
-        } catch (Exception e) {
-            // Re-throw any exception except the one we're looking for.
-            if (!e.toString().contains("Illegal rule: foo bar")) throw e;
-        }
-    }
-
-    @SmallTest
-    public void testRewriteRule() throws UrlRules.RuleFormatException {
-        Rule rule = new Rule("test_rule",
-                "http://foo.bar/ rewrite http://bar.foo/");
-        assertEquals("test_rule", rule.mName);
-        assertEquals("http://foo.bar/", rule.mPrefix);
-        assertEquals("http://bar.foo/", rule.mRewrite);
-        assertFalse(rule.mBlock);
-        assertEquals("http://bar.foo/bat", rule.apply("http://foo.bar/bat"));
-    }
-
-    @SmallTest
-    public void testBlockRule() throws UrlRules.RuleFormatException {
-        Rule rule = new Rule("test_rule",
-                "http://foo.bar/ block");
-        assertEquals("test_rule", rule.mName);
-        assertEquals("http://foo.bar/", rule.mPrefix);
-        assertTrue(rule.mRewrite == null);
-        assertTrue(rule.mBlock);
-        assertTrue(rule.apply("http://foo.bar/bat") == null);
-    }
-
-    @SmallTest
-    public void testMatchRule() throws UrlRules.RuleFormatException {
-        UrlRules rules = new UrlRules(new Rule[] {
-            new Rule("12", "http://one.two/ rewrite http://buckle.my.shoe/"),
-            new Rule("34", "http://three.four/ rewrite http://close.the.door/"),
-            new Rule("56", "http://five.six/ rewrite http://pick.up.sticks/"),
-        });
-
-        assertTrue(rules.matchRule("https://one.two/") == Rule.DEFAULT);
-        assertTrue(rules.matchRule("http://one.two") == Rule.DEFAULT);
-        assertEquals("12", rules.matchRule("http://one.two/foo").mName);
-
-        String u = "http://five.six/bar";
-        assertEquals("http://pick.up.sticks/bar", rules.matchRule(u).apply(u));
-    }
-
-    @SmallTest
-    public void testAmbiguousMatch() throws UrlRules.RuleFormatException {
-        // Rule is the longest match wins.
-        UrlRules rules = new UrlRules(new Rule[] {
-            new Rule("1", "http://xyz/one rewrite http://rewrite/"),
-            new Rule("123", "http://xyz/onetwothree rewrite http://rewrite/"),
-            new Rule("12", "http://xyz/onetwo rewrite http://rewrite/"),
-        });
-
-        assertEquals("1", rules.matchRule("http://xyz/one").mName);
-        assertEquals("1", rules.matchRule("http://xyz/one...").mName);
-        assertEquals("12", rules.matchRule("http://xyz/onetwo...").mName);
-        assertEquals("123", rules.matchRule("http://xyz/onetwothree...").mName);
-
-    }
-
-    @MediumTest
-    public void testGservicesRules() {
-        // TODO: use a MockContentProvider/MockContentResolver instead.
-        ContentResolver r = getContext().getContentResolver();
-
-        // Update the digest, so the UrlRules cache is reloaded.
-        Settings.Gservices.putString(r, "digest", "testGservicesRules");
-        Settings.Gservices.putString(r, "url:blank_test", "");
-        Settings.Gservices.putString(r, "url:test",
-                "http://foo.bar/ rewrite http://bar.foo/");
-
-        UrlRules rules = UrlRules.getRules(r);  // Don't crash, please.  :)
-        assertTrue(rules.matchRule("http://bar.foo/") == Rule.DEFAULT);
-
-        Rule rule = rules.matchRule("http://foo.bar/bat");
-        assertEquals("test", rule.mName);
-        assertEquals("http://foo.bar/", rule.mPrefix);
-        assertEquals("http://bar.foo/", rule.mRewrite);
-        assertFalse(rule.mBlock);
-    }
-}
diff --git a/tests/BrowserTestPlugin/jni/main.cpp b/tests/BrowserTestPlugin/jni/main.cpp
index c896ad5..586d139 100644
--- a/tests/BrowserTestPlugin/jni/main.cpp
+++ b/tests/BrowserTestPlugin/jni/main.cpp
@@ -168,7 +168,10 @@
 NPError NPP_Destroy(NPP instance, NPSavedData** save)
 {
     PluginObject *obj = (PluginObject*) instance->pdata;
-    delete obj->subPlugin;
+    if (obj) {
+        delete obj->subPlugin;
+        browser->releaseobject(&obj->header);
+    }
 
     return NPERR_NO_ERROR;
 }