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