StrictModeActivity.java revision 91f194ee7d75f2fe88427afef4705928b6023e31
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;
2798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.ServiceConnection;
2898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.PackageManager;
2998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.pm.ResolveInfo;
3098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Configuration;
3198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.content.res.Resources;
3298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.database.Cursor;
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.Config;
5298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.util.Log;
5398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.view.View;
5498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.Button;
5598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.CheckBox;
5698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport android.widget.TextView;
5798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
58750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.HttpResponse;
59750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpUriRequest;
60750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.client.methods.HttpGet;
61750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport org.apache.http.impl.client.DefaultHttpClient;
62750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
6398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.File;
6498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.FileInputStream;
6591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrickimport java.io.FileOutputStream;
6698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.IOException;
6798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.InputStream;
6898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.OutputStream;
6998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickimport java.io.RandomAccessFile;
70750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.InetAddress;
71750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrickimport java.net.URL;
7298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
7398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrickpublic class StrictModeActivity extends Activity {
7498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
7598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private static final String TAG = "StrictModeActivity";
7698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private static final Uri SYSTEM_SETTINGS_URI = Uri.parse("content://settings/system");
7798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
7898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private ContentResolver cr;
7998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
80bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final static class SimpleConnection implements ServiceConnection {
81bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public IService stub = null;
82bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public void onServiceConnected(ComponentName name, IBinder service) {
83bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            stub = IService.Stub.asInterface(service);
84bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            Log.v(TAG, "Service connected: " + name);
85bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        }
86bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        public void onServiceDisconnected(ComponentName name) {
87bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            stub = null;
88bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            Log.v(TAG, "Service disconnected: " + name);
89bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        }
90bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
91bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
92bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final SimpleConnection mLocalServiceConn = new SimpleConnection();
93bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    private final SimpleConnection mRemoteServiceConn = new SimpleConnection();
94bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
9598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    /** Called when the activity is first created. */
9698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    @Override
9798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    public void onCreate(Bundle savedInstanceState) {
9898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        super.onCreate(savedInstanceState);
9998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        setContentView(R.layout.main);
10098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
10198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        cr = getContentResolver();
10298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final SQLiteDatabase db = openOrCreateDatabase("foo.db", MODE_PRIVATE, null);
10398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
10498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final Button readButton = (Button) findViewById(R.id.read_button);
10598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        readButton.setOnClickListener(new View.OnClickListener() {
10698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
10798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    Cursor c = null;
10898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    try {
10998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                        c = db.rawQuery("SELECT * FROM foo", null);
11098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    } finally {
11198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                        if (c != null) c.close();
11298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    }
11398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
11498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            });
11598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
11698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final Button writeButton = (Button) findViewById(R.id.write_button);
11798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        writeButton.setOnClickListener(new View.OnClickListener() {
11898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
11998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    db.execSQL("CREATE TABLE IF NOT EXISTS FOO (a INT)");
12098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
12198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            });
12298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
123750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button dnsButton = (Button) findViewById(R.id.dns_button);
124750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        dnsButton.setOnClickListener(new View.OnClickListener() {
125750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
126750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    Log.d(TAG, "Doing DNS lookup for www.l.google.com... "
127750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                          + "(may be cached by InetAddress)");
128750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
129750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InetAddress[] addrs = InetAddress.getAllByName("www.l.google.com");
130750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        for (int i = 0; i < addrs.length; ++i) {
131750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                            Log.d(TAG, "got: " + addrs[i]);
132750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        }
133750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (java.net.UnknownHostException e) {
134750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "DNS error: " + e);
135750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
136750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
137750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
138750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
139750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button httpButton = (Button) findViewById(R.id.http_button);
140750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        httpButton.setOnClickListener(new View.OnClickListener() {
141750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
142750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
143750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // Note: not using AndroidHttpClient, as that comes with its
144750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // own pre-StrictMode network-on-Looper thread check.  The
145750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // intent of this test is that we test the network stack's
146750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // instrumentation for StrictMode instead.
147750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        DefaultHttpClient httpClient = new DefaultHttpClient();
148750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        HttpResponse res = httpClient.execute(
149750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                            new HttpGet("http://www.android.com/favicon.ico"));
150750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Fetched http response: " + res);
151750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
152750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
153750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
154750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
155750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
156750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
157750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button http2Button = (Button) findViewById(R.id.http2_button);
158750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        http2Button.setOnClickListener(new View.OnClickListener() {
159750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
160750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
161750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // Usually this ends up tripping in DNS resolution,
162750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // so see http3Button below, which connects directly to an IP
163750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InputStream is = new URL("http://www.android.com/")
164750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .openConnection()
165750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .getInputStream();
166750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Got input stream: " + is);
167750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
168750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
169750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
170750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
171750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
172750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
173750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        final Button http3Button = (Button) findViewById(R.id.http3_button);
174750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick        http3Button.setOnClickListener(new View.OnClickListener() {
175750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                public void onClick(View v) {
176750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    try {
177750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        // One of Google's web IPs, as of 2010-06-16....
178750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        InputStream is = new URL("http://74.125.19.14/")
179750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .openConnection()
180750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                                .getInputStream();
181750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "Got input stream: " + is);
182750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    } catch (IOException e) {
183750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                        Log.d(TAG, "HTTP fetch error: " + e);
184750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                    }
185750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick                }
186750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick            });
187750bf8a97a746685797d3d1066ef48326e96d398Brad Fitzpatrick
188bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderLocalButton = (Button) findViewById(R.id.binder_local_button);
189bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderLocalButton.setOnClickListener(new View.OnClickListener() {
190bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
191bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
192bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        boolean value = mLocalServiceConn.stub.doDiskWrite(123 /* dummy */);
193bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local writeToDisk returned: " + value);
194bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
195bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local binderButton error: " + e);
196bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
197bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
198bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
199bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
200bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderRemoteButton = (Button) findViewById(R.id.binder_remote_button);
201bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderRemoteButton.setOnClickListener(new View.OnClickListener() {
202bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
203bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
204bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        boolean value = mRemoteServiceConn.stub.doDiskWrite(123 /* dummy */);
205bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "remote writeToDisk returned: " + value);
206bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
207bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "remote binderButton error: " + e);
208bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
209bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
210bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
211bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
212bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        final Button binderCheckButton = (Button) findViewById(R.id.binder_check_button);
213bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        binderCheckButton.setOnClickListener(new View.OnClickListener() {
214bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                public void onClick(View v) {
215bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    int policy;
216bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    try {
217bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        policy = mLocalServiceConn.stub.getThreadPolicy();
218bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "local service policy: " + policy);
219bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        policy = mRemoteServiceConn.stub.getThreadPolicy();
220bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "remote service policy: " + policy);
221bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    } catch (RemoteException e) {
222bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                        Log.d(TAG, "binderCheckButton error: " + e);
223bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    }
224bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                }
225bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick            });
226bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
22791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick        final Button serviceDumpButton = (Button) findViewById(R.id.service_dump);
22891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick        serviceDumpButton.setOnClickListener(new View.OnClickListener() {
22991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                public void onClick(View v) {
23091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    Log.d(TAG, "About to do a service dump...");
23191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    File file = new File("/sdcard/strictmode-service-dump.txt");
23291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    FileOutputStream output = null;
23391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    final int oldPolicy = StrictMode.getThreadBlockingPolicy();
23491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    try {
23591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        StrictMode.setThreadBlockingPolicy(0);
23691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        output = new FileOutputStream(file);
23791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        StrictMode.setThreadBlockingPolicy(oldPolicy);
23891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        boolean dumped = Debug.dumpService("cpuinfo",
23991f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                                                           output.getFD(), new String[0]);
24091f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        Log.d(TAG, "Dumped = " + dumped);
24191f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    } catch (IOException e) {
24291f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        Log.e(TAG, "Can't dump service", e);
24391f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    } finally {
24491f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                        StrictMode.setThreadBlockingPolicy(oldPolicy);
24591f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    }
24691f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                    Log.d(TAG, "Did service dump.");
24791f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick                }
24891f194ee7d75f2fe88427afef4705928b6023e31Brad Fitzpatrick            });
249bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
25098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoWrite = (CheckBox) findViewById(R.id.policy_no_write);
25198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoRead = (CheckBox) findViewById(R.id.policy_no_reads);
25298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkNoNetwork = (CheckBox) findViewById(R.id.policy_no_network);
25398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyLog = (CheckBox) findViewById(R.id.policy_penalty_log);
25498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDialog = (CheckBox) findViewById(R.id.policy_penalty_dialog);
25598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDeath = (CheckBox) findViewById(R.id.policy_penalty_death);
25698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        final CheckBox checkPenaltyDropBox = (CheckBox) findViewById(R.id.policy_penalty_dropbox);
25798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
25898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        View.OnClickListener changePolicy = new View.OnClickListener() {
25998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                public void onClick(View v) {
26098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    int newPolicy = 0;
26198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkNoWrite.isChecked()) newPolicy |= StrictMode.DISALLOW_DISK_WRITE;
26298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkNoRead.isChecked()) newPolicy |= StrictMode.DISALLOW_DISK_READ;
26398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkNoNetwork.isChecked()) newPolicy |= StrictMode.DISALLOW_NETWORK;
26498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkPenaltyLog.isChecked()) newPolicy |= StrictMode.PENALTY_LOG;
26598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkPenaltyDialog.isChecked()) newPolicy |= StrictMode.PENALTY_DIALOG;
26698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkPenaltyDeath.isChecked()) newPolicy |= StrictMode.PENALTY_DEATH;
26798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    if (checkPenaltyDropBox.isChecked()) newPolicy |= StrictMode.PENALTY_DROPBOX;
26898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    Log.v(TAG, "Changing policy to: " + newPolicy);
26998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                    StrictMode.setThreadBlockingPolicy(newPolicy);
27098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick                }
27198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            };
27298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoWrite.setOnClickListener(changePolicy);
27398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoRead.setOnClickListener(changePolicy);
27498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkNoNetwork.setOnClickListener(changePolicy);
27598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyLog.setOnClickListener(changePolicy);
27698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDialog.setOnClickListener(changePolicy);
27798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDeath.setOnClickListener(changePolicy);
27898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        checkPenaltyDropBox.setOnClickListener(changePolicy);
27998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
28098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
28198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private void fileReadLoop() {
28298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        RandomAccessFile raf = null;
28398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        File filename = getFileStreamPath("test.dat");
28498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        try {
28598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            long sumNanos = 0;
28698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            byte[] buf = new byte[512];
28798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
28898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf = new RandomAccessFile(filename, "rw");
28998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf.write(buf);
29098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf.close();
29198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            //raf = null;
29298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
29398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            // The data's almost certainly cached -- it's not clear what we're testing here
29498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf = new RandomAccessFile(filename, "r");
29598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf.seek(0);
29698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            raf.read(buf);
29798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } catch (IOException e) {
29898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.e(TAG, "File read failed", e);
29998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } finally {
30098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            try { if (raf != null) raf.close(); } catch (IOException e) {}
30198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        }
30298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
30398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick
30498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    // Returns milliseconds taken, or -1 on failure.
30598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    private long settingsWrite(int mode) {
30698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        Cursor c = null;
30798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        long startTime = SystemClock.uptimeMillis();
30898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        // The database will take care of replacing duplicates.
30998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        try {
31098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            ContentValues values = new ContentValues();
31198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            values.put("name", "dummy_for_testing");
31298540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            values.put("value", "" + startTime);
31398540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Uri uri = cr.insert(SYSTEM_SETTINGS_URI, values);
31498540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.v(TAG, "inserted uri: " + uri);
31598540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        } catch (SQLException e) {
31698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            Log.w(TAG, "sqliteexception during write: " + e);
31798540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick            return -1;
31898540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        }
31998540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        long duration = SystemClock.uptimeMillis() - startTime;
32098540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick        return duration;
32198540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick    }
322bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
323bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    @Override public void onResume() {
324bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        super.onResume();
325bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        bindService(new Intent(this, LocalService.class),
326bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    mLocalServiceConn, Context.BIND_AUTO_CREATE);
327bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        bindService(new Intent(this, RemoteService.class),
328bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick                    mRemoteServiceConn, Context.BIND_AUTO_CREATE);
329bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
330bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick
331bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    @Override public void onPause() {
332bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        super.onPause();
333bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        unbindService(mLocalServiceConn);
334bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick        unbindService(mRemoteServiceConn);
335bf0b70137b5dba7fb0e038f2dcc9b758cf8d0c9fBrad Fitzpatrick    }
33698540d210e070cbe536472eeac220857aa90fae2Brad Fitzpatrick}
337