198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick/*
298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick *
498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * you may not use this file except in compliance with the License.
698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * You may obtain a copy of the License at
798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick *
898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick *
1098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
1198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
1298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * See the License for the specific language governing permissions and
1498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick * limitations under the License.
1598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick */
1698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
1798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickpackage com.android.strictmodetest;
1898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
1998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.app.Activity;
2098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ComponentName;
2198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentQueryMap;
2298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentResolver;
2398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ContentValues;
2498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.Context;
2598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.IContentProvider;
2698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.Intent;
274162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrickimport android.content.SharedPreferences;
2898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ServiceConnection;
2998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.PackageManager;
3098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.ResolveInfo;
3198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Configuration;
3298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Resources;
3398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.Cursor;
3498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.SQLException;
3598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.sqlite.SQLiteDatabase;
3698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.LocalSocket;
3798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.LocalSocketAddress;
3898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.net.Uri;
3998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Bundle;
4098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Debug;
4198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Handler;
4298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.IBinder;
4398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.Parcel;
4498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.RemoteException;
4598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.ServiceManager;
4698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.StrictMode;
4798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.os.SystemClock;
4898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.telephony.TelephonyManager;
4998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.text.TextUtils;
5098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.AndroidException;
5198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.Log;
5298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.view.View;
5398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.Button;
5498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.CheckBox;
5598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.TextView;
5698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
5751c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrickimport dalvik.system.BlockGuard;
5851c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick
59750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.HttpResponse;
60750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpUriRequest;
61750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpGet;
62750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.impl.client.DefaultHttpClient;
63750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
6498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.File;
6598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.FileInputStream;
6691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrickimport java.io.FileOutputStream;
6798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.IOException;
6898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.InputStream;
6998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.OutputStream;
7098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.RandomAccessFile;
71750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.InetAddress;
72439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrickimport java.net.Socket;
73750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.URL;
740aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrickimport java.util.ArrayList;
7598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
7698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickpublic class StrictModeActivity extends Activity {
7798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
7898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private static final String TAG = "StrictModeActivity";
7998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private static final Uri SYSTEM_SETTINGS_URI = Uri.parse("content://settings/system");
8098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
8198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private ContentResolver cr;
8298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
83bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final static class SimpleConnection implements ServiceConnection {
84bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public IService stub = null;
85bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public void onServiceConnected(ComponentName name, IBinder service) {
86bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            stub = IService.Stub.asInterface(service);
87bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            Log.v(TAG, "Service connected: " + name);
88bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        }
89bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public void onServiceDisconnected(ComponentName name) {
90bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            stub = null;
91bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            Log.v(TAG, "Service disconnected: " + name);
92bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        }
93bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
94bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
95bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final SimpleConnection mLocalServiceConn = new SimpleConnection();
96bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final SimpleConnection mRemoteServiceConn = new SimpleConnection();
97bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
984162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick    private SQLiteDatabase mDb;
994162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick
10098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    /** Called when the activity is first created. */
10198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    @Override
10298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    public void onCreate(Bundle savedInstanceState) {
10398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        super.onCreate(savedInstanceState);
10498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        setContentView(R.layout.main);
10598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
10698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        cr = getContentResolver();
1074162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        mDb = openOrCreateDatabase("foo.db", MODE_PRIVATE, null);
10898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
10998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final Button readButton = (Button) findViewById(R.id.read_button);
11098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        readButton.setOnClickListener(new View.OnClickListener() {
11198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
1124162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    SharedPreferences prefs = getSharedPreferences("foo", 0);
11398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    try {
1144162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        Cursor c = null;
1154162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        try {
1164162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                            c = mDb.rawQuery("SELECT * FROM foo", null);
1174162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        } finally {
1184162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                            if (c != null) c.close();
1194162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        }
1204162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    } catch (android.database.sqlite.SQLiteException e) {
1214162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        Log.e(TAG, "SQLiteException: " + e);
12298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    }
12398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
12498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            });
12598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
12698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final Button writeButton = (Button) findViewById(R.id.write_button);
12798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        writeButton.setOnClickListener(new View.OnClickListener() {
12898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
1294162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    mDb.execSQL("CREATE TABLE IF NOT EXISTS FOO (a INT)");
1304162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    SharedPreferences prefs = getSharedPreferences("foo", 0);
1314162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    prefs.edit().putLong("time", System.currentTimeMillis()).commit();
13298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
13398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            });
13498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
13551c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick        final Button writeLoopButton = (Button) findViewById(R.id.write_loop_button);
13651c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick        writeLoopButton.setOnClickListener(new View.OnClickListener() {
13751c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                public void onClick(View v) {
13851c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    long startTime = SystemClock.uptimeMillis();
13951c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    int iters = 1000;
14051c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    BlockGuard.Policy policy = BlockGuard.getThreadPolicy();
14151c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    for (int i = 0; i < iters; ++i) {
14251c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                        policy.onWriteToDisk();
14351c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    }
14451c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    long endTime = SystemClock.uptimeMillis();
14551c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                    Log.d(TAG, "Time for " + iters + ": " + (endTime - startTime) + ", avg=" +
14651c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                          (endTime - startTime) / (double) iters);
14751c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick                }
14851c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick            });
14951c7a876135b1a93dd0c11eecfbbbc32b8e3ed5fBrad Fitzpatrick
150750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button dnsButton = (Button) findViewById(R.id.dns_button);
151750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        dnsButton.setOnClickListener(new View.OnClickListener() {
152750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
153750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    Log.d(TAG, "Doing DNS lookup for www.l.google.com... "
154750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                          + "(may be cached by InetAddress)");
155750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
156750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InetAddress[] addrs = InetAddress.getAllByName("www.l.google.com");
157750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        for (int i = 0; i < addrs.length; ++i) {
158750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                            Log.d(TAG, "got: " + addrs[i]);
159750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        }
160750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (java.net.UnknownHostException e) {
161750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "DNS error: " + e);
162750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
1634162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick
1644162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    // Now try a random hostname to evade libcore's
1654162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    // DNS caching.
1664162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    try {
1674162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        String random = "" + Math.random();
1684162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        random = random.substring(random.indexOf(".") + 1);
1694162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        String domain = random + ".livejournal.com";
1704162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        InetAddress addr = InetAddress.getByName(domain);
1714162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        Log.d(TAG, "for random domain " + domain + ": " + addr);
1724162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    } catch (java.net.UnknownHostException e) {
1734162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    }
174750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
175750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
176750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
177750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button httpButton = (Button) findViewById(R.id.http_button);
178750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        httpButton.setOnClickListener(new View.OnClickListener() {
179750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
180750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
181750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // Note: not using AndroidHttpClient, as that comes with its
182750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // own pre-StrictMode network-on-Looper thread check.  The
183750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // intent of this test is that we test the network stack's
184750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // instrumentation for StrictMode instead.
185750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        DefaultHttpClient httpClient = new DefaultHttpClient();
186750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        HttpResponse res = httpClient.execute(
187750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                            new HttpGet("http://www.android.com/favicon.ico"));
188750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Fetched http response: " + res);
189750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
190750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
191750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
192750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
193750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
194750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
195750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button http2Button = (Button) findViewById(R.id.http2_button);
196750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        http2Button.setOnClickListener(new View.OnClickListener() {
197750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
198750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
199750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // Usually this ends up tripping in DNS resolution,
200750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // so see http3Button below, which connects directly to an IP
201750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InputStream is = new URL("http://www.android.com/")
202750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .openConnection()
203750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .getInputStream();
204750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Got input stream: " + is);
205750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
206750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
207750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
208750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
209750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
210750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
211750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button http3Button = (Button) findViewById(R.id.http3_button);
212750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        http3Button.setOnClickListener(new View.OnClickListener() {
213750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
214750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
215750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // One of Google's web IPs, as of 2010-06-16....
216750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InputStream is = new URL("http://74.125.19.14/")
217750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .openConnection()
218750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .getInputStream();
219750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Got input stream: " + is);
220750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
221750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
222750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
223750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
224750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
225750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
226bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderLocalButton = (Button) findViewById(R.id.binder_local_button);
227bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderLocalButton.setOnClickListener(new View.OnClickListener() {
228bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
229bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
230bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        boolean value = mLocalServiceConn.stub.doDiskWrite(123 /* dummy */);
231bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local writeToDisk returned: " + value);
232bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
233bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local binderButton error: " + e);
234bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
235bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
236bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
237bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
238bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderRemoteButton = (Button) findViewById(R.id.binder_remote_button);
239bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderRemoteButton.setOnClickListener(new View.OnClickListener() {
240bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
241bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
242439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                        boolean value = mRemoteServiceConn.stub.doDiskWrite(1);
243439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                        Log.d(TAG, "remote writeToDisk #1 returned: " + value);
244439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                        value = mRemoteServiceConn.stub.doDiskWrite(2);
245439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                        Log.d(TAG, "remote writeToDisk #2 returned: " + value);
246bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
247bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "remote binderButton error: " + e);
248bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
249bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
250bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
251bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
2524ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick        final Button binderOneWayButton = (Button) findViewById(R.id.binder_oneway_button);
2534ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick        binderOneWayButton.setOnClickListener(new View.OnClickListener() {
2544ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                public void onClick(View v) {
2554ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                    try {
2564ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                        Log.d(TAG, "doing oneway disk write over Binder.");
2574ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                        mRemoteServiceConn.stub.doDiskOneWay();
2584ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                    } catch (RemoteException e) {
2594ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                        Log.d(TAG, "remote binderButton error: " + e);
2604ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                    }
2614ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                }
2624ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick            });
2634ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick
264bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderCheckButton = (Button) findViewById(R.id.binder_check_button);
265bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderCheckButton.setOnClickListener(new View.OnClickListener() {
266bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
267bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    int policy;
268bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
269bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        policy = mLocalServiceConn.stub.getThreadPolicy();
270bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local service policy: " + policy);
271bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        policy = mRemoteServiceConn.stub.getThreadPolicy();
272bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "remote service policy: " + policy);
273bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
274bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "binderCheckButton error: " + e);
275bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
276bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
277bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
278bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
27991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick        final Button serviceDumpButton = (Button) findViewById(R.id.service_dump);
28091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick        serviceDumpButton.setOnClickListener(new View.OnClickListener() {
28191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                public void onClick(View v) {
28291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    Log.d(TAG, "About to do a service dump...");
28391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    File file = new File("/sdcard/strictmode-service-dump.txt");
28491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    FileOutputStream output = null;
28529432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
28691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    try {
28729432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                        StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX);
28891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        output = new FileOutputStream(file);
2894ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                        StrictMode.setThreadPolicy(oldPolicy);
29091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        boolean dumped = Debug.dumpService("cpuinfo",
29191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                                                           output.getFD(), new String[0]);
29291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        Log.d(TAG, "Dumped = " + dumped);
29391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    } catch (IOException e) {
29491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        Log.e(TAG, "Can't dump service", e);
29591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    } finally {
2964ec87d33cb702da6dbb8315825356210cb7217f1Brad Fitzpatrick                        StrictMode.setThreadPolicy(oldPolicy);
29791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    }
29891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    Log.d(TAG, "Did service dump.");
29991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                }
30091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick            });
301bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
302439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        final Button lingerCloseButton = (Button) findViewById(R.id.linger_close_button);
303439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        lingerCloseButton.setOnClickListener(new View.OnClickListener() {
304439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                public void onClick(View v) {
305439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                    closeWithLinger(true);
306439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                }
307439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            });
308439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick
309439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        final Button nonlingerCloseButton = (Button) findViewById(R.id.nonlinger_close_button);
310439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        nonlingerCloseButton.setOnClickListener(new View.OnClickListener() {
311439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                public void onClick(View v) {
312439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                    closeWithLinger(false);
313439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick                }
314439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            });
315439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick
31629432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick        final Button leakCursorButton = (Button) findViewById(R.id.leak_cursor_button);
31729432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick        leakCursorButton.setOnClickListener(new View.OnClickListener() {
31829432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                public void onClick(View v) {
31929432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    final StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy();
32029432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    try {
32129432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
32229432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                                               .detectLeakedSqlLiteObjects()
32329432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                                               .penaltyLog()
32429432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                                               .penaltyDropBox()
32529432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                                               .build());
3264162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        mDb.execSQL("CREATE TABLE IF NOT EXISTS FOO (a INT)");
3274162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                        Cursor c = mDb.rawQuery("SELECT * FROM foo", null);
32829432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                        c = null;  // never close it
32929432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                        Runtime.getRuntime().gc();
33029432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    } finally {
33129432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                        StrictMode.setVmPolicy(oldPolicy);
33229432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    }
33329432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick
33429432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                }
33529432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick            });
336439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick
33707b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        final Button customButton = (Button) findViewById(R.id.custom_button);
33807b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        customButton.setOnClickListener(new View.OnClickListener() {
33907b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick                public void onClick(View v) {
34007b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick                    StrictMode.noteSlowCall("my example call");
34107b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick                }
34207b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick            });
34307b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick
3440aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick        final Button gcInstanceButton = (Button) findViewById(R.id.gc_instance_button);
3450aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick        gcInstanceButton.setOnClickListener(new View.OnClickListener() {
3460aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                public void onClick(View v) {
3470aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    ArrayList<DummyObject> list = new ArrayList<DummyObject>();
3480aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    list.add(new DummyObject());
3490aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    list.add(new DummyObject());
3500aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick
3510aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(StrictMode.getVmPolicy())
3520aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                                           .setClassInstanceLimit(DummyObject.class, 1)
3530aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                                           .penaltyLog()
3540aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                                           .penaltyDropBox()
3550aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                                           .build());
3560aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    StrictMode.conditionallyCheckInstanceCounts();
3570aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                    list.clear();
3580aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick                }
3590aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick            });
3600aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick
36198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoWrite = (CheckBox) findViewById(R.id.policy_no_write);
36298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoRead = (CheckBox) findViewById(R.id.policy_no_reads);
36398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoNetwork = (CheckBox) findViewById(R.id.policy_no_network);
36407b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        final CheckBox checkCustom = (CheckBox) findViewById(R.id.policy_custom);
365a277bc77da86894b61e4b4bab074dfcd31282caeAlan Viverette        final CheckBox checkResourceMismatch = (CheckBox) findViewById(R.id.policy_resource_mismatch);
36698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyLog = (CheckBox) findViewById(R.id.policy_penalty_log);
36798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDialog = (CheckBox) findViewById(R.id.policy_penalty_dialog);
36898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDeath = (CheckBox) findViewById(R.id.policy_penalty_death);
36998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDropBox = (CheckBox) findViewById(R.id.policy_penalty_dropbox);
37007b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        final CheckBox checkPenaltyFlash = (CheckBox) findViewById(R.id.policy_penalty_flash);
3714162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        final CheckBox checkPenaltyNetworkDeath = (CheckBox) findViewById(R.id.policy_penalty_network_death);
37298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
37398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        View.OnClickListener changePolicy = new View.OnClickListener() {
37498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
37529432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    StrictMode.ThreadPolicy.Builder newPolicy = new StrictMode.ThreadPolicy.Builder();
37629432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkNoWrite.isChecked()) newPolicy.detectDiskWrites();
37729432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkNoRead.isChecked()) newPolicy.detectDiskReads();
37829432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkNoNetwork.isChecked()) newPolicy.detectNetwork();
37907b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick                    if (checkCustom.isChecked()) newPolicy.detectCustomSlowCalls();
380a277bc77da86894b61e4b4bab074dfcd31282caeAlan Viverette                    if (checkResourceMismatch.isChecked()) newPolicy.detectResourceMismatches();
38129432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkPenaltyLog.isChecked()) newPolicy.penaltyLog();
38229432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkPenaltyDialog.isChecked()) newPolicy.penaltyDialog();
38329432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkPenaltyDeath.isChecked()) newPolicy.penaltyDeath();
38429432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    if (checkPenaltyDropBox.isChecked()) newPolicy.penaltyDropBox();
38507b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick                    if (checkPenaltyFlash.isChecked()) newPolicy.penaltyFlashScreen();
3864162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick                    if (checkPenaltyNetworkDeath.isChecked()) newPolicy.penaltyDeathOnNetwork();
38729432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    StrictMode.ThreadPolicy policy = newPolicy.build();
38829432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    Log.v(TAG, "Changing policy to: " + policy);
38929432c4666c4acbfda645c723b39229ad05db953Brad Fitzpatrick                    StrictMode.setThreadPolicy(policy);
39098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
39198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            };
39298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoWrite.setOnClickListener(changePolicy);
39398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoRead.setOnClickListener(changePolicy);
39498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoNetwork.setOnClickListener(changePolicy);
39507b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        checkCustom.setOnClickListener(changePolicy);
396a277bc77da86894b61e4b4bab074dfcd31282caeAlan Viverette        checkResourceMismatch.setOnClickListener(changePolicy);
39798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyLog.setOnClickListener(changePolicy);
39898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDialog.setOnClickListener(changePolicy);
39998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDeath.setOnClickListener(changePolicy);
40098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDropBox.setOnClickListener(changePolicy);
40107b8aa58ce92413bfd79ea7cb875b7c55277b5f6Brad Fitzpatrick        checkPenaltyFlash.setOnClickListener(changePolicy);
4024162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        checkPenaltyNetworkDeath.setOnClickListener(changePolicy);
4034162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick    }
4044162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick
4054162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick    @Override
4064162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick    public void onDestroy() {
4074162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        super.onDestroy();
4084162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        mDb.close();
4094162d18ec381bc683fa61d5aaa73565742f922caBrad Fitzpatrick        mDb = null;
41098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
41198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
412439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick    private void closeWithLinger(boolean linger) {
413439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        Log.d(TAG, "Socket linger test; linger=" + linger);
414439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        try {
415439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            Socket socket = new Socket();
416439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            socket.setSoLinger(linger, 5);
417439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            socket.close();
418439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        } catch (IOException e) {
419439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick            Log.e(TAG, "Error with linger close", e);
420439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick        }
421439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick    }
422439aa8236cf93f0160d70d9d164ddea7894c2d58Brad Fitzpatrick
42398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private void fileReadLoop() {
42498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        RandomAccessFile raf = null;
42598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        File filename = getFileStreamPath("test.dat");
42698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        try {
42798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            long sumNanos = 0;
42898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            byte[] buf = new byte[512];
42998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
43098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf = new RandomAccessFile(filename, "rw");
43198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf.write(buf);
43298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf.close();
43398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf = null;
43498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
43598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            // The data's almost certainly cached -- it's not clear what we're testing here
43698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf = new RandomAccessFile(filename, "r");
43798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf.seek(0);
43898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf.read(buf);
43998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } catch (IOException e) {
44098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.e(TAG, "File read failed", e);
44198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } finally {
44298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            try { if (raf != null) raf.close(); } catch (IOException e) {}
44398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        }
44498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
44598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
44698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    // Returns milliseconds taken, or -1 on failure.
44798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private long settingsWrite(int mode) {
44898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        Cursor c = null;
44998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        long startTime = SystemClock.uptimeMillis();
45098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        // The database will take care of replacing duplicates.
45198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        try {
45298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            ContentValues values = new ContentValues();
45398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            values.put("name", "dummy_for_testing");
45498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            values.put("value", "" + startTime);
45598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Uri uri = cr.insert(SYSTEM_SETTINGS_URI, values);
45698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.v(TAG, "inserted uri: " + uri);
45798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } catch (SQLException e) {
45898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.w(TAG, "sqliteexception during write: " + e);
45998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            return -1;
46098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        }
46198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        long duration = SystemClock.uptimeMillis() - startTime;
46298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        return duration;
46398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
464bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
465bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    @Override public void onResume() {
466bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        super.onResume();
467bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        bindService(new Intent(this, LocalService.class),
468bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    mLocalServiceConn, Context.BIND_AUTO_CREATE);
469bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        bindService(new Intent(this, RemoteService.class),
470bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    mRemoteServiceConn, Context.BIND_AUTO_CREATE);
471bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
472bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
473bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    @Override public void onPause() {
474bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        super.onPause();
475bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        unbindService(mLocalServiceConn);
476bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        unbindService(mRemoteServiceConn);
477bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
4780aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick
4790aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick    private static class DummyObject {
4800aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick        int foo;
4810aed0d20df4984c1df5145356929a904852ac4ecBrad Fitzpatrick    }
48298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick}
483