TestService.java revision 4c18ad56f7e9b84bb075fd39c8e712c7871430a0
16b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn/*
26b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project
36b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn *
46b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
56b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * you may not use this file except in compliance with the License.
66b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * You may obtain a copy of the License at
76b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn *
86b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
96b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn *
106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * See the License for the specific language governing permissions and
146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn * limitations under the License.
156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn */
166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornpackage com.android.frameworkperf;
186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport java.io.File;
206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport java.io.FileNotFoundException;
216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport java.io.FileOutputStream;
226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport java.io.IOException;
236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport java.io.RandomAccessFile;
246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport org.xmlpull.v1.XmlPullParser;
266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.app.Service;
296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.Context;
306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.Intent;
316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.pm.PackageManager;
326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.res.TypedArray;
336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.res.XmlResourceParser;
346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.graphics.Bitmap;
356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.graphics.BitmapFactory;
364c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tateimport android.graphics.Paint;
376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Bundle;
386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.FileUtils;
396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Handler;
406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.IBinder;
416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Looper;
426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Message;
436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Messenger;
446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Process;
456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.RemoteException;
466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.SystemClock;
476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.AttributeSet;
486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.DisplayMetrics;
496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Log;
506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Xml;
516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.view.LayoutInflater;
526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornpublic class TestService extends Service {
546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final String TAG = "Perf";
556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mOpPairs = new Op[] {
576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new NoOp(),
586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CpuOp(),
596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new SchedulerOp(),
606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new GcOp(),
616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateFileOp(),
626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteFileOp(),
636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteSyncFileOp(),
646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new WriteFileOp(),
656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new ReadFileOp(),
666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(), new SchedulerOp(),
676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new GcOp(), new NoOp(),
684c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new ObjectGcOp(), new NoOp(),
694c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new FinalizingGcOp(), new NoOp(),
704c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new PaintGcOp(), new NoOp(),
716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new NoOp(),
726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CpuOp(),
736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new SchedulerOp(),
746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new GcOp(),
756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateFileOp(),
766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteFileOp(),
776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteSyncFileOp(),
786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new WriteFileOp(),
796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new ReadFileOp(),
806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(), new NoOp(),
816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(), new NoOp(),
826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(), new NoOp(),
836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new NoOp(),
846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new NoOp(),
856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteFileOp(),
866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteFileOp(),
876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteSyncFileOp(),
886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteSyncFileOp(),
896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new WriteFileOp(),
906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new ReadFileOp(),
916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new WriteFileOp(),
926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new ReadFileOp(),
936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(), new NoOp(),
946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(), new NoOp(),
956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(), new NoOp(),
966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(), new NoOp(),
976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(), new NoOp(),
986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(), new NoOp(),
996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(), new NoOp(),
1006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(), new NoOp(),
1016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(), new NoOp(),
1026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(), new NoOp(),
1036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(), new NoOp(),
1046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(), new NoOp(),
1056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(), new NoOp(),
1066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(), new NoOp(),
1076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(), new NoOp(),
1086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(), new NoOp(),
1096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(), new NoOp(),
1106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mAvailOps = new Op[] {
1136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            null,
1146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new NoOp(),
1156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CpuOp(),
1166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(),
1176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(),
1184c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new GcOp(),
1194c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new ObjectGcOp(),
1204c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new FinalizingGcOp(),
1214c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new PaintGcOp(),
1226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(),
1236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(),
1246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(),
1256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(),
1266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(),
1276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(),
1286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(),
1296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(),
1306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(),
1316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(),
1326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(),
1336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(),
1346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(),
1356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(),
1366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(),
1376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(),
1386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(),
1396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(),
1406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(),
1416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(),
1426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(),
1436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(),
1446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(),
1456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_START_TEST = 1;
1486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_TERMINATE = 2;
149dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
150dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final int MSG_REALLY_START = 1000;
151dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final int MSG_REALLY_TERMINATE = 1001;
152dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
1536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TEST_FINISHED = 1;
1546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TERMINATED = 2;
1556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final Handler mHandler = new Handler() {
1576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void handleMessage(Message msg) {
1586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            switch (msg.what) {
1596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_START_TEST: {
160dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    // Give a little time for things to settle down.
161dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    Message newMsg = Message.obtain(null, MSG_REALLY_START);
162dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.obj = msg.obj;
163dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.replyTo = msg.replyTo;
164dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    sendMessageDelayed(newMsg, 500);
165dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
166dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                case MSG_REALLY_START: {
1676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Bundle bundle = (Bundle)msg.obj;
1686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    bundle.setClassLoader(getClassLoader());
1696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final TestArgs args = (TestArgs)bundle.getParcelable("args");
1706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final Messenger replyTo = msg.replyTo;
1716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mRunner.run(this, args, new Runnable() {
1726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
1736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (replyTo != null) {
1746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Message msg = Message.obtain(null, RES_TEST_FINISHED);
1756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Bundle bundle = new Bundle();
1766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                bundle.putParcelable("res", new RunResult(mRunner));
1776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                msg.obj = bundle;
1786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                try {
1796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                    replyTo.send(msg);
1806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                } catch (RemoteException e) {
1816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                }
1826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
1836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
1846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
1856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } break;
1866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_TERMINATE: {
187dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    // Give a little time for things to settle down.
188dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    Message newMsg = Message.obtain(null, MSG_REALLY_TERMINATE);
189dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.obj = msg.obj;
190dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.replyTo = msg.replyTo;
191dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    sendMessageDelayed(newMsg, 50);
192dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
193dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                case MSG_REALLY_TERMINATE: {
1946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (msg.replyTo != null) {
1956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        Message reply = Message.obtain(null, RES_TERMINATED);
1966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        try {
1976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            msg.replyTo.send(reply);
1986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        } catch (RemoteException e) {
1996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
2006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
2016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    terminate();
202dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
2036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
2066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final TestRunner mRunner = new TestRunner();
2086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    @Override
2106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public IBinder onBind(Intent intent) {
2116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        return (new Messenger(mHandler)).getBinder();
2126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
2136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void terminate() {
215dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        Runtime.getRuntime().exit(0);
2166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
2176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    enum BackgroundMode {
2196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NOTHING,
2206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CPU,
2216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SCHEDULER
2226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
2236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public class TestRunner {
2256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Handler mHandler;
2266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mMaxRunTime;
2276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mForegroundOp;
2286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mBackgroundOp;
2296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Runnable mDoneCallback;
2306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mBackgroundThread;
2326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mForegroundThread;
2336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mStartTime;
2346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mBackgroundRunning;
2366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mForegroundRunning;
2376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundEndTime;
2396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundOps;
2406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundEndTime;
2416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundOps;
2426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public TestRunner() {
2446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundName() {
2476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getName();
2486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundName() {
2516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getName();
2526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
2556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String fgName = mForegroundOp.getName();
2566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String bgName = mBackgroundOp.getName();
2576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            StringBuilder res = new StringBuilder();
2586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (fgName != null) {
2596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(fgName);
2606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Fg");
2616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (bgName != null) {
2636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(bgName);
2646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Bg");
2656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return res.toString();
2676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundLongName() {
2706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getLongName();
2716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundLongName() {
2746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getLongName();
2756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run(Handler handler, TestArgs args, Runnable doneCallback) {
2786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler = handler;
2796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mMaxRunTime = args.maxTime;
2806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (args.combOp >= 0) {
2816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mOpPairs[args.combOp];
2826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mOpPairs[args.combOp+1];
2836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
2846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mAvailOps[args.fgOp];
2856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mAvailOps[args.bgOp];
2866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mDoneCallback = doneCallback;
2886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread = new RunnerThread("background", new Runnable() {
2896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
2906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
2916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
2926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
2936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mBackgroundOp.onRun();
2946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
2956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(running, true) && running);
2966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundEndTime = SystemClock.uptimeMillis();
2976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundOps = ops * mBackgroundOp.getOpsPerRun();
2986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(false);
2996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_BACKGROUND);
3016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread = new RunnerThread("background", new Runnable() {
3026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
3036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
3046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
3056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
3066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mForegroundOp.onRun();
3076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
3086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(true, running) && running);
3096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundEndTime = SystemClock.uptimeMillis();
3106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundOps = ops * mForegroundOp.getOpsPerRun();
3116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(true);
3126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_FOREGROUND);
3146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundOp.onInit(TestService.this, true);
3166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundOp.onInit(TestService.this, false);
3176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mStartTime = SystemClock.uptimeMillis();
3206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundRunning = true;
3216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundRunning = true;
3226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread.start();
3256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread.start();
3266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundTime() {
3296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundEndTime-mStartTime;
3306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundOps() {
3336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOps;
3346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundTime() {
3376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundEndTime-mStartTime;
3386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundOps() {
3416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOps;
3426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private boolean evalRepeat(boolean bgRunning, boolean fgRunning) {
3456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!bgRunning) {
3476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!fgRunning) {
3506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                long now = SystemClock.uptimeMillis();
3566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (now > (mStartTime+mMaxRunTime)) {
3576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return true;
3606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private void threadFinished(boolean foreground) {
3646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (foreground) {
3666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } else {
3686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mHandler.post(new Runnable() {
3726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
3736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mForegroundOp.onTerm(TestService.this);
3746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mBackgroundOp.onTerm(TestService.this);
3756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (mDoneCallback != null) {
3766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                mDoneCallback.run();
3776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
3786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
3796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
3806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    class RunnerThread extends Thread {
3866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final Runnable mOp;
3876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final int mPriority;
3886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread(String name, Runnable op, int priority) {
3906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(name);
3916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp = op;
3926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPriority = priority;
3936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run() {
3966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(mPriority);
3976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp.run();
3986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static public abstract class Op {
4026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mName;
4036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mLongName;
4046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public Op(String name, String longName) {
4066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mName = name;
4076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLongName = longName;
4086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
4116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mName;
4126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getLongName() {
4156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mLongName;
4166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
4196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        abstract boolean onRun();
4226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
4246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 1;
4286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class NoOp extends Op {
4326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NoOp() {
4336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(null, "Nothing");
4346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return false;
4386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
4426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CpuOp extends Op {
4466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CpuOp() {
4476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CPU", "Consume CPU");
4486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class SchedulerOp extends Op {
4566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SchedulerOp() {
4576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Sched", "Change scheduler group");
4586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
4626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class GcOp extends Op {
4686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        GcOp() {
4696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Gc", "Run garbage collector");
4706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            byte[] stuff = new byte[1024*1024];
4746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4784c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class ObjectGcOp extends Op {
4794c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        ObjectGcOp() {
4804c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("ObjectGc", "Run garbage collector with simple objects");
4814c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
4824c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
4834c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
4844c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Object obj = new Object();
4854c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
4864c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
4874c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
4884c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
4894c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class FinalizingGcOp extends Op {
4904c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        class Finalizable {
4914c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable() {}
4924c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            @Override
4934c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            protected void finalize() throws Throwable {
4944c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate                super.finalize();
4954c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            }
4964c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
4974c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
4984c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        FinalizingGcOp() {
4994c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("FinalizingGc", "Run garbage collector with finalizable objects");
5004c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5014c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5024c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5034c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable obj = new Finalizable();
5044c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5054c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5064c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5074c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5084c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class PaintGcOp extends Op {
5094c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        PaintGcOp() {
5104c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("PaintGc", "Run garbage collector with Paint objects");
5114c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5124c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5134c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5144c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Paint p = new Paint();
5154c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5164c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5174c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5184c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class MethodCallOp extends Op {
5206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        MethodCallOp() {
5216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("MethodCall", "Method call");
5226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                someFunc(i);
5286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int someFunc(int foo) {
5336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
5346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 500;
5386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class IpcOp extends Op {
5426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        PackageManager mPm;
5436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        String mProcessName;
5446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        IpcOp() {
5466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Ipc", "IPC to system process");
5476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPm = context.getPackageManager();
5516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mProcessName = context.getApplicationInfo().processName;
5526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mPm.queryContentProviders(mProcessName, Process.myUid(), 0);
5586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 100;
5646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class OpenXmlResOp extends Op {
5686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        OpenXmlResOp() {
5716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("OpenXmlRes", "Open (and close) an XML resource");
5726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            XmlResourceParser parser = mContext.getResources().getLayout(R.xml.simple);
5806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            parser.close();
5816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadXmlAttrsOp extends Op {
5866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        XmlResourceParser mParser;
5886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        AttributeSet mAttrs;
5896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadXmlAttrsOp() {
5916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadXmlAttrs", "Read attributes from an XML tag");
5926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser = mContext.getResources().getLayout(R.xml.simple);
5976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mAttrs = Xml.asAttributeSet(mParser);
5986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            int eventType;
6006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
6016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                // Find the first <item> tag.
6026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                eventType = mParser.getEventType();
6036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                String tagName;
6046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                do {
6056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (eventType == XmlPullParser.START_TAG) {
6066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        tagName = mParser.getName();
6076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        if (tagName.equals("item")) {
6086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            break;
6096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
6106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
6116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    eventType = mParser.next();
6126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } while (eventType != XmlPullParser.END_DOCUMENT);
6136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (XmlPullParserException e) {
6146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
6166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
6216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser.close();
6226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TypedArray a = mContext.obtainStyledAttributes(mAttrs,
6266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    com.android.internal.R.styleable.MenuItem);
6276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            a.recycle();
6286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseXmlResOp extends Op {
6336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseXmlResOp() {
6366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseXmlRes", "Parse compiled XML resource");
6376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple);
6466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseLargeXmlResOp extends Op {
6516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseLargeXmlResOp() {
6546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseLargeXmlRes", "Parse large XML resource");
6556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple_large);
6646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterOp extends Op {
6696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterOp() {
6726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflater", "Inflate layout resource");
6736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.small_layout, null);
6866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterLargeOp extends Op {
6916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterLargeOp() {
6946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterLarge", "Inflate large layout resource");
6956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.large_layout, null);
7086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterViewOp extends Op {
7136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterViewOp() {
7166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterView", "Inflate layout with 50 View objects");
7176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.view_layout, null);
7306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterButtonOp extends Op {
7356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterButtonOp() {
7386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterButton", "Inflate layout with 50 Button objects");
7396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.button_layout, null);
7526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterImageButtonOp extends Op {
7576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterImageButtonOp() {
7606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterImageButton", "Inflate layout with 50 ImageButton objects");
7616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.image_button_layout, null);
7746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateBitmapOp extends Op {
7796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateBitmapOp() {
7826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateBitmap", "Create a Bitmap");
7836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
7916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
7926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
7936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateRecycleBitmapOp extends Op {
7986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateRecycleBitmapOp() {
8016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateRecycleBitmap", "Create and recycle a Bitmap");
8026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
8126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallBitmapOp extends Op {
8186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallBitmapOp() {
8216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallBitmap", "Load small raw bitmap");
8226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleSmallBitmapOp extends Op {
8386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleSmallBitmapOp() {
8416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleSmallBitmap", "Load and recycle small raw bitmap");
8426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeBitmapOp extends Op {
8596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeBitmapOp() {
8626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeBitmap", "Load large raw bitmap");
8636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
8746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleLargeBitmapOp extends Op {
8796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleLargeBitmapOp() {
8826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleLargeBitmap", "Load and recycle large raw bitmap");
8836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
8946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallScaledBitmapOp extends Op {
9006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallScaledBitmapOp() {
9036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallScaledBitmap", "Load small raw bitmap that is scaled for density");
9046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample_scale, opts);
9156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeScaledBitmapOp extends Op {
9206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeScaledBitmapOp() {
9236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeScaledBitmap", "Load large raw bitmap that is scaled for density");
9246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate_scale, opts);
9356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateFileOp extends Op {
9406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateFileOp() {
9436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateFile", "Create and delete a file");
9446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mFile.createNewFile();
9546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteFileOp extends Op {
9636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteFileOp() {
9666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteFile", "Create, write, and delete a file");
9676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
9776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
9786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
9796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteSyncFileOp extends Op {
9886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteSyncFileOp() {
9916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteSyncFile", "Create, write, sync, and delete a file");
9926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
10026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
10036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.flush();
10046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileUtils.sync(fos);
10056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
10066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class WriteFileOp extends Op {
10156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        WriteFileOp() {
10206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("WriteFile", "Truncate and write a 64k file");
10216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (FileNotFoundException e) {
10336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure writing " + mFile, e);
10446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
10496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
10516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
10536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadFileOp extends Op {
10596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadFileOp() {
10646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadFile", "Seek and read a 64k file");
10656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.read(mBuffer);
10886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure reading " + mFile, e);
10906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
10956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
10976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
10996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
11016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
11036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn}
1104