TestService.java revision 6b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06
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;
366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Bundle;
376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.FileUtils;
386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Handler;
396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.IBinder;
406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Looper;
416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Message;
426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Messenger;
436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Process;
446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.RemoteException;
456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.SystemClock;
466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.AttributeSet;
476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.DisplayMetrics;
486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Log;
496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Xml;
506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.view.LayoutInflater;
516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornpublic class TestService extends Service {
536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final String TAG = "Perf";
546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mOpPairs = new Op[] {
566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new NoOp(),
576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CpuOp(),
586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new SchedulerOp(),
596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new GcOp(),
606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateFileOp(),
616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteFileOp(),
626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteSyncFileOp(),
636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new WriteFileOp(),
646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new ReadFileOp(),
656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(), new SchedulerOp(),
666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new GcOp(), new NoOp(),
676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new NoOp(),
686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CpuOp(),
696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new SchedulerOp(),
706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new GcOp(),
716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateFileOp(),
726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteFileOp(),
736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteSyncFileOp(),
746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new WriteFileOp(),
756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new ReadFileOp(),
766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(), new NoOp(),
776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(), new NoOp(),
786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(), new NoOp(),
796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new NoOp(),
806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new NoOp(),
816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteFileOp(),
826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteFileOp(),
836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteSyncFileOp(),
846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteSyncFileOp(),
856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new WriteFileOp(),
866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new ReadFileOp(),
876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new WriteFileOp(),
886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new ReadFileOp(),
896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(), new NoOp(),
906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(), new NoOp(),
916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(), new NoOp(),
926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(), new NoOp(),
936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(), new NoOp(),
946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(), new NoOp(),
956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(), new NoOp(),
966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(), new NoOp(),
976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(), new NoOp(),
986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(), new NoOp(),
996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(), new NoOp(),
1006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(), new NoOp(),
1016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(), new NoOp(),
1026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(), new NoOp(),
1036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(), new NoOp(),
1046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(), new NoOp(),
1056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(), new NoOp(),
1066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mAvailOps = new Op[] {
1096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            null,
1106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new NoOp(),
1116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CpuOp(),
1126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(),
1136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(),
1146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(),
1156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(),
1166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(),
1176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(),
1186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(),
1196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(),
1206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(),
1216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(),
1226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(),
1236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(),
1246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(),
1256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(),
1266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(),
1276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(),
1286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(),
1296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(),
1306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(),
1316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(),
1326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(),
1336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(),
1346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(),
1356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(),
1366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(),
1376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_START_TEST = 1;
1406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_TERMINATE = 2;
1416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TEST_FINISHED = 1;
1436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TERMINATED = 2;
1446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final Handler mHandler = new Handler() {
1466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void handleMessage(Message msg) {
1476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            switch (msg.what) {
1486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_START_TEST: {
1496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Bundle bundle = (Bundle)msg.obj;
1506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    bundle.setClassLoader(getClassLoader());
1516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final TestArgs args = (TestArgs)bundle.getParcelable("args");
1526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final Messenger replyTo = msg.replyTo;
1536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mRunner.run(this, args, new Runnable() {
1546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
1556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (replyTo != null) {
1566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Message msg = Message.obtain(null, RES_TEST_FINISHED);
1576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Bundle bundle = new Bundle();
1586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                bundle.putParcelable("res", new RunResult(mRunner));
1596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                msg.obj = bundle;
1606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                try {
1616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                    replyTo.send(msg);
1626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                } catch (RemoteException e) {
1636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                }
1646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
1656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
1666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
1676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } break;
1686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_TERMINATE: {
1696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (msg.replyTo != null) {
1706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        Message reply = Message.obtain(null, RES_TERMINATED);
1716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        try {
1726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            msg.replyTo.send(reply);
1736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        } catch (RemoteException e) {
1746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
1756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
1766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    terminate();
1776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
1786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
1796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
1806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final TestRunner mRunner = new TestRunner();
1836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    @Override
1856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public IBinder onBind(Intent intent) {
1866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        return (new Messenger(mHandler)).getBinder();
1876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
1886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void terminate() {
1906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Process.killProcess(Process.myPid());
1916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
1926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    enum BackgroundMode {
1946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NOTHING,
1956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CPU,
1966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SCHEDULER
1976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public class TestRunner {
2006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Handler mHandler;
2016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mMaxRunTime;
2026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mForegroundOp;
2036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mBackgroundOp;
2046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Runnable mDoneCallback;
2056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mBackgroundThread;
2076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mForegroundThread;
2086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mStartTime;
2096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mBackgroundRunning;
2116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mForegroundRunning;
2126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundEndTime;
2146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundOps;
2156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundEndTime;
2166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundOps;
2176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public TestRunner() {
2196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundName() {
2226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getName();
2236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundName() {
2266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getName();
2276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
2306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String fgName = mForegroundOp.getName();
2316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String bgName = mBackgroundOp.getName();
2326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            StringBuilder res = new StringBuilder();
2336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (fgName != null) {
2346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(fgName);
2356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Fg");
2366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (bgName != null) {
2386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(bgName);
2396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Bg");
2406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return res.toString();
2426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundLongName() {
2456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getLongName();
2466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundLongName() {
2496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getLongName();
2506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run(Handler handler, TestArgs args, Runnable doneCallback) {
2536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler = handler;
2546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mMaxRunTime = args.maxTime;
2556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (args.combOp >= 0) {
2566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mOpPairs[args.combOp];
2576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mOpPairs[args.combOp+1];
2586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
2596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mAvailOps[args.fgOp];
2606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mAvailOps[args.bgOp];
2616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mDoneCallback = doneCallback;
2636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread = new RunnerThread("background", new Runnable() {
2646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
2656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
2666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
2676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
2686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mBackgroundOp.onRun();
2696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
2706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(running, true) && running);
2716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundEndTime = SystemClock.uptimeMillis();
2726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundOps = ops * mBackgroundOp.getOpsPerRun();
2736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(false);
2746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
2756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_BACKGROUND);
2766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread = new RunnerThread("background", new Runnable() {
2776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
2786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
2796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
2806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
2816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mForegroundOp.onRun();
2826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
2836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(true, running) && running);
2846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundEndTime = SystemClock.uptimeMillis();
2856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundOps = ops * mForegroundOp.getOpsPerRun();
2866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(true);
2876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
2886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_FOREGROUND);
2896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundOp.onInit(TestService.this, true);
2916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundOp.onInit(TestService.this, false);
2926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
2946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mStartTime = SystemClock.uptimeMillis();
2956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundRunning = true;
2966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundRunning = true;
2976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread.start();
3006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread.start();
3016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundTime() {
3046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundEndTime-mStartTime;
3056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundOps() {
3086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOps;
3096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundTime() {
3126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundEndTime-mStartTime;
3136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundOps() {
3166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOps;
3176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private boolean evalRepeat(boolean bgRunning, boolean fgRunning) {
3206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!bgRunning) {
3226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!fgRunning) {
3256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                long now = SystemClock.uptimeMillis();
3316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (now > (mStartTime+mMaxRunTime)) {
3326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return true;
3356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private void threadFinished(boolean foreground) {
3396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (foreground) {
3416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } else {
3436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mHandler.post(new Runnable() {
3476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
3486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mForegroundOp.onTerm(TestService.this);
3496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mBackgroundOp.onTerm(TestService.this);
3506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (mDoneCallback != null) {
3516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                mDoneCallback.run();
3526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
3536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
3546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
3556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    class RunnerThread extends Thread {
3616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final Runnable mOp;
3626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final int mPriority;
3636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread(String name, Runnable op, int priority) {
3656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(name);
3666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp = op;
3676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPriority = priority;
3686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run() {
3716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(mPriority);
3726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp.run();
3736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static public abstract class Op {
3776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mName;
3786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mLongName;
3796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public Op(String name, String longName) {
3816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mName = name;
3826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLongName = longName;
3836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
3866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mName;
3876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getLongName() {
3906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mLongName;
3916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
3946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        abstract boolean onRun();
3976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
3996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 1;
4036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class NoOp extends Op {
4076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NoOp() {
4086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(null, "Nothing");
4096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return false;
4136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
4176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CpuOp extends Op {
4216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CpuOp() {
4226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CPU", "Consume CPU");
4236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class SchedulerOp extends Op {
4316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SchedulerOp() {
4326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Sched", "Change scheduler group");
4336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
4376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class GcOp extends Op {
4436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        GcOp() {
4446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Gc", "Run garbage collector");
4456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            byte[] stuff = new byte[1024*1024];
4496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class MethodCallOp extends Op {
4546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        MethodCallOp() {
4556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("MethodCall", "Method call");
4566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
4606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
4616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                someFunc(i);
4626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
4636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int someFunc(int foo) {
4676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
4686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 500;
4726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class IpcOp extends Op {
4766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        PackageManager mPm;
4776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        String mProcessName;
4786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        IpcOp() {
4806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Ipc", "IPC to system process");
4816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
4846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPm = context.getPackageManager();
4856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mProcessName = context.getApplicationInfo().processName;
4866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
4906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
4916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mPm.queryContentProviders(mProcessName, Process.myUid(), 0);
4926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
4936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 100;
4986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class OpenXmlResOp extends Op {
5026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        OpenXmlResOp() {
5056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("OpenXmlRes", "Open (and close) an XML resource");
5066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            XmlResourceParser parser = mContext.getResources().getLayout(R.xml.simple);
5146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            parser.close();
5156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadXmlAttrsOp extends Op {
5206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        XmlResourceParser mParser;
5226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        AttributeSet mAttrs;
5236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadXmlAttrsOp() {
5256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadXmlAttrs", "Read attributes from an XML tag");
5266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser = mContext.getResources().getLayout(R.xml.simple);
5316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mAttrs = Xml.asAttributeSet(mParser);
5326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            int eventType;
5346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
5356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                // Find the first <item> tag.
5366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                eventType = mParser.getEventType();
5376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                String tagName;
5386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                do {
5396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (eventType == XmlPullParser.START_TAG) {
5406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        tagName = mParser.getName();
5416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        if (tagName.equals("item")) {
5426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            break;
5436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
5446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
5456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    eventType = mParser.next();
5466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } while (eventType != XmlPullParser.END_DOCUMENT);
5476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (XmlPullParserException e) {
5486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
5496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
5506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
5516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
5556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser.close();
5566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TypedArray a = mContext.obtainStyledAttributes(mAttrs,
5606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    com.android.internal.R.styleable.MenuItem);
5616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            a.recycle();
5626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseXmlResOp extends Op {
5676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseXmlResOp() {
5706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseXmlRes", "Parse compiled XML resource");
5716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
5796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple);
5806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseLargeXmlResOp extends Op {
5856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseLargeXmlResOp() {
5886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseLargeXmlRes", "Parse large XML resource");
5896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
5936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
5976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple_large);
5986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterOp extends Op {
6036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterOp() {
6066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflater", "Inflate layout resource");
6076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.small_layout, null);
6206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterLargeOp extends Op {
6256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterLargeOp() {
6286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterLarge", "Inflate large layout resource");
6296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.large_layout, null);
6426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterViewOp extends Op {
6476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterViewOp() {
6506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterView", "Inflate layout with 50 View objects");
6516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.view_layout, null);
6646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterButtonOp extends Op {
6696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterButtonOp() {
6726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterButton", "Inflate layout with 50 Button objects");
6736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
6816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
6826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
6846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
6856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.button_layout, null);
6866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterImageButtonOp extends Op {
6916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterImageButtonOp() {
6946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterImageButton", "Inflate layout with 50 ImageButton objects");
6956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.image_button_layout, null);
7086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateBitmapOp extends Op {
7136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateBitmapOp() {
7166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateBitmap", "Create a Bitmap");
7176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
7256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
7266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
7276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateRecycleBitmapOp extends Op {
7326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateRecycleBitmapOp() {
7356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateRecycleBitmap", "Create and recycle a Bitmap");
7366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
7446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
7456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
7466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
7476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallBitmapOp extends Op {
7526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallBitmapOp() {
7556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallBitmap", "Load small raw bitmap");
7566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
7646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
7656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
7666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
7676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleSmallBitmapOp extends Op {
7726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleSmallBitmapOp() {
7756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleSmallBitmap", "Load and recycle small raw bitmap");
7766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
7846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
7856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
7866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
7876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
7886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeBitmapOp extends Op {
7936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeBitmapOp() {
7966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeBitmap", "Load large raw bitmap");
7976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
8086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleLargeBitmapOp extends Op {
8136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleLargeBitmapOp() {
8166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleLargeBitmap", "Load and recycle large raw bitmap");
8176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
8286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallScaledBitmapOp extends Op {
8346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallScaledBitmapOp() {
8376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallScaledBitmap", "Load small raw bitmap that is scaled for density");
8386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample_scale, opts);
8496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeScaledBitmapOp extends Op {
8546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeScaledBitmapOp() {
8576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeScaledBitmap", "Load large raw bitmap that is scaled for density");
8586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate_scale, opts);
8696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateFileOp extends Op {
8746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
8756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateFileOp() {
8776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateFile", "Create and delete a file");
8786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
8826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
8836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
8876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mFile.createNewFile();
8886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
8896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
8906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
8916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
8926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteFileOp extends Op {
8976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
8986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteFileOp() {
9006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteFile", "Create, write, and delete a file");
9016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
9116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
9126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
9136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteSyncFileOp extends Op {
9226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteSyncFileOp() {
9256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteSyncFile", "Create, write, sync, and delete a file");
9266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
9366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
9376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.flush();
9386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileUtils.sync(fos);
9396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
9406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class WriteFileOp extends Op {
9496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
9516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
9526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        WriteFileOp() {
9546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("WriteFile", "Truncate and write a 64k file");
9556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
9596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
9606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
9616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
9666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (FileNotFoundException e) {
9676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
9746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
9756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
9766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure writing " + mFile, e);
9786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
9836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
9856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
9876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadFileOp extends Op {
9936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
9956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
9966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadFileOp() {
9986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadFile", "Seek and read a 64k file");
9996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.read(mBuffer);
10226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure reading " + mFile, e);
10246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
10296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
10316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
10336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn}
1038