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;
22780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        long mMaxOps;
2286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mForegroundOp;
2296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mBackgroundOp;
2306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Runnable mDoneCallback;
2316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mBackgroundThread;
2336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mForegroundThread;
2346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mStartTime;
2356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mBackgroundRunning;
2376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mForegroundRunning;
2386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundEndTime;
2406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundOps;
2416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundEndTime;
2426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundOps;
2436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public TestRunner() {
2456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundName() {
2486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getName();
2496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundName() {
2526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getName();
2536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
2566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String fgName = mForegroundOp.getName();
2576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String bgName = mBackgroundOp.getName();
2586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            StringBuilder res = new StringBuilder();
2596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (fgName != null) {
2606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(fgName);
2616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Fg");
2626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (bgName != null) {
2646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(bgName);
2656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Bg");
2666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return res.toString();
2686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundLongName() {
2716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getLongName();
2726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundLongName() {
2756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getLongName();
2766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run(Handler handler, TestArgs args, Runnable doneCallback) {
2796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler = handler;
2806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mMaxRunTime = args.maxTime;
28180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            mMaxOps = args.maxOps;
2826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (args.combOp >= 0) {
2836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mOpPairs[args.combOp];
2846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mOpPairs[args.combOp+1];
2856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
2866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mAvailOps[args.fgOp];
2876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mAvailOps[args.bgOp];
2886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mDoneCallback = doneCallback;
2906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread = new RunnerThread("background", new Runnable() {
2916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
2926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
2936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
2946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
2956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mBackgroundOp.onRun();
2966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
2976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(running, true) && running);
2986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundEndTime = SystemClock.uptimeMillis();
2996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundOps = ops * mBackgroundOp.getOpsPerRun();
3006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(false);
3016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_BACKGROUND);
3036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread = new RunnerThread("background", new Runnable() {
3046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
3056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
3066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
3076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
3086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mForegroundOp.onRun();
3096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
3106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(true, running) && running);
3116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundEndTime = SystemClock.uptimeMillis();
3126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundOps = ops * mForegroundOp.getOpsPerRun();
3136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(true);
3146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_FOREGROUND);
3166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundOp.onInit(TestService.this, true);
3186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundOp.onInit(TestService.this, false);
3196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mStartTime = SystemClock.uptimeMillis();
3226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundRunning = true;
3236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundRunning = true;
3246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread.start();
3276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread.start();
3286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundTime() {
3316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundEndTime-mStartTime;
3326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundOps() {
3356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOps;
3366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundTime() {
3396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundEndTime-mStartTime;
3406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundOps() {
3436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOps;
3446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private boolean evalRepeat(boolean bgRunning, boolean fgRunning) {
3476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!bgRunning) {
3496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!fgRunning) {
3526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
35780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                if (mMaxOps > 0) {
35880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    // iteration-limited case
35980a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    if (mForegroundOps >= mMaxOps) {
36080a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                        return false;
36180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    }
36280a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    mForegroundOps++;
36380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                } else {
36480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    // time-limited case
36580a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    long now = SystemClock.uptimeMillis();
36680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    if (now > (mStartTime+mMaxRunTime)) {
36780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                        return false;
36880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    }
3696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return true;
3716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private void threadFinished(boolean foreground) {
3756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (foreground) {
3776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } else {
3796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mHandler.post(new Runnable() {
3836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
3846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mForegroundOp.onTerm(TestService.this);
3856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mBackgroundOp.onTerm(TestService.this);
3866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (mDoneCallback != null) {
3876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                mDoneCallback.run();
3886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
3896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
3906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
3916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    class RunnerThread extends Thread {
3976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final Runnable mOp;
3986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final int mPriority;
3996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread(String name, Runnable op, int priority) {
4016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(name);
4026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp = op;
4036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPriority = priority;
4046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run() {
4076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(mPriority);
4086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp.run();
4096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static public abstract class Op {
4136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mName;
4146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mLongName;
4156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public Op(String name, String longName) {
4176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mName = name;
4186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLongName = longName;
4196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
4226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mName;
4236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getLongName() {
4266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mLongName;
4276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
4306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        abstract boolean onRun();
4336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
4356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 1;
4396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class NoOp extends Op {
4436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NoOp() {
4446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(null, "Nothing");
4456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return false;
4496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
4536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CpuOp extends Op {
4576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CpuOp() {
4586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CPU", "Consume CPU");
4596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class SchedulerOp extends Op {
4676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SchedulerOp() {
4686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Sched", "Change scheduler group");
4696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
4736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class GcOp extends Op {
4796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        GcOp() {
4806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Gc", "Run garbage collector");
4816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            byte[] stuff = new byte[1024*1024];
4856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4894c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class ObjectGcOp extends Op {
4904c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        ObjectGcOp() {
4914c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("ObjectGc", "Run garbage collector with simple objects");
4924c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
4934c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
4944c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
4954c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Object obj = new Object();
4964c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
4974c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
4984c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
4994c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5004c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class FinalizingGcOp extends Op {
5014c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        class Finalizable {
5024c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable() {}
5034c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            @Override
5044c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            protected void finalize() throws Throwable {
5054c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate                super.finalize();
5064c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            }
5074c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5084c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5094c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        FinalizingGcOp() {
5104c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("FinalizingGc", "Run garbage collector with finalizable objects");
5114c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5124c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5134c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5144c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable obj = new Finalizable();
5154c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5164c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5174c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5184c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5194c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class PaintGcOp extends Op {
5204c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        PaintGcOp() {
5214c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("PaintGc", "Run garbage collector with Paint objects");
5224c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5234c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5244c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5254c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Paint p = new Paint();
5264c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5274c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5284c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5294c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class MethodCallOp extends Op {
5316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        MethodCallOp() {
5326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("MethodCall", "Method call");
5336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                someFunc(i);
5396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int someFunc(int foo) {
5446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
5456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 500;
5496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class IpcOp extends Op {
5536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        PackageManager mPm;
5546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        String mProcessName;
5556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        IpcOp() {
5576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Ipc", "IPC to system process");
5586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPm = context.getPackageManager();
5626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mProcessName = context.getApplicationInfo().processName;
5636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mPm.queryContentProviders(mProcessName, Process.myUid(), 0);
5696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 100;
5756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class OpenXmlResOp extends Op {
5796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        OpenXmlResOp() {
5826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("OpenXmlRes", "Open (and close) an XML resource");
5836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            XmlResourceParser parser = mContext.getResources().getLayout(R.xml.simple);
5916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            parser.close();
5926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadXmlAttrsOp extends Op {
5976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        XmlResourceParser mParser;
5996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        AttributeSet mAttrs;
6006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadXmlAttrsOp() {
6026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadXmlAttrs", "Read attributes from an XML tag");
6036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser = mContext.getResources().getLayout(R.xml.simple);
6086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mAttrs = Xml.asAttributeSet(mParser);
6096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            int eventType;
6116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
6126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                // Find the first <item> tag.
6136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                eventType = mParser.getEventType();
6146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                String tagName;
6156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                do {
6166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (eventType == XmlPullParser.START_TAG) {
6176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        tagName = mParser.getName();
6186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        if (tagName.equals("item")) {
6196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            break;
6206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
6216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
6226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    eventType = mParser.next();
6236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } while (eventType != XmlPullParser.END_DOCUMENT);
6246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (XmlPullParserException e) {
6256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
6276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
6326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser.close();
6336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TypedArray a = mContext.obtainStyledAttributes(mAttrs,
6376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    com.android.internal.R.styleable.MenuItem);
6386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            a.recycle();
6396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseXmlResOp extends Op {
6446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseXmlResOp() {
6476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseXmlRes", "Parse compiled XML resource");
6486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple);
6576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseLargeXmlResOp extends Op {
6626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseLargeXmlResOp() {
6656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseLargeXmlRes", "Parse large XML resource");
6666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple_large);
6756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterOp extends Op {
6806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterOp() {
6836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflater", "Inflate layout resource");
6846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.small_layout, null);
6976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterLargeOp extends Op {
7026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterLargeOp() {
7056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterLarge", "Inflate large layout resource");
7066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.large_layout, null);
7196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterViewOp extends Op {
7246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterViewOp() {
7276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterView", "Inflate layout with 50 View objects");
7286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.view_layout, null);
7416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterButtonOp extends Op {
7466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterButtonOp() {
7496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterButton", "Inflate layout with 50 Button objects");
7506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.button_layout, null);
7636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterImageButtonOp extends Op {
7686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterImageButtonOp() {
7716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterImageButton", "Inflate layout with 50 ImageButton objects");
7726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.image_button_layout, null);
7856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateBitmapOp extends Op {
7906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateBitmapOp() {
7936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateBitmap", "Create a Bitmap");
7946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
8046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateRecycleBitmapOp extends Op {
8096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateRecycleBitmapOp() {
8126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateRecycleBitmap", "Create and recycle a Bitmap");
8136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
8236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallBitmapOp extends Op {
8296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallBitmapOp() {
8326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallBitmap", "Load small raw bitmap");
8336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleSmallBitmapOp extends Op {
8496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleSmallBitmapOp() {
8526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleSmallBitmap", "Load and recycle small raw bitmap");
8536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeBitmapOp extends Op {
8706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeBitmapOp() {
8736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeBitmap", "Load large raw bitmap");
8746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
8856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleLargeBitmapOp extends Op {
8906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleLargeBitmapOp() {
8936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleLargeBitmap", "Load and recycle large raw bitmap");
8946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
9056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
9066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallScaledBitmapOp extends Op {
9116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallScaledBitmapOp() {
9146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallScaledBitmap", "Load small raw bitmap that is scaled for density");
9156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample_scale, opts);
9266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeScaledBitmapOp extends Op {
9316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeScaledBitmapOp() {
9346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeScaledBitmap", "Load large raw bitmap that is scaled for density");
9356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate_scale, opts);
9466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateFileOp extends Op {
9516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateFileOp() {
9546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateFile", "Create and delete a file");
9556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mFile.createNewFile();
9656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteFileOp extends Op {
9746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteFileOp() {
9776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteFile", "Create, write, and delete a file");
9786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
9886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
9896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
9906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteSyncFileOp extends Op {
9996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteSyncFileOp() {
10026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteSyncFile", "Create, write, sync, and delete a file");
10036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
10136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
10146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.flush();
10156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileUtils.sync(fos);
10166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
10176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class WriteFileOp extends Op {
10266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        WriteFileOp() {
10316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("WriteFile", "Truncate and write a 64k file");
10326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (FileNotFoundException e) {
10446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure writing " + mFile, e);
10556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
10606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
10626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
10646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadFileOp extends Op {
10706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadFileOp() {
10756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadFile", "Seek and read a 64k file");
10766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.read(mBuffer);
10996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
11006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure reading " + mFile, e);
11016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
11036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
11056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
11066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
11076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
11086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
11096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
11106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
11126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
11146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn}
1115