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;
24f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.lang.String;
25f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.HashMap;
26f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport java.util.Random;
276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
28f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackbornimport android.util.ArrayMap;
296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport org.xmlpull.v1.XmlPullParser;
306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.app.Service;
336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.Context;
346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.Intent;
356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.pm.PackageManager;
366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.res.TypedArray;
376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.res.XmlResourceParser;
386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.graphics.Bitmap;
396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.graphics.BitmapFactory;
404c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tateimport android.graphics.Paint;
416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Bundle;
426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.FileUtils;
436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Handler;
446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.IBinder;
456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Looper;
466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Message;
476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Messenger;
486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Process;
496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.RemoteException;
506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.SystemClock;
516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.AttributeSet;
526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.DisplayMetrics;
536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Log;
546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.util.Xml;
556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.view.LayoutInflater;
566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornpublic class TestService extends Service {
586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final String TAG = "Perf";
596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mOpPairs = new Op[] {
616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new NoOp(),
626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CpuOp(),
636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new SchedulerOp(),
646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new GcOp(),
656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateFileOp(),
666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteFileOp(),
676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new CreateWriteSyncFileOp(),
686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new WriteFileOp(),
696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(), new ReadFileOp(),
706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(), new SchedulerOp(),
716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new GcOp(), new NoOp(),
724c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new ObjectGcOp(), new NoOp(),
734c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new FinalizingGcOp(), new NoOp(),
744c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new PaintGcOp(), new NoOp(),
756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new NoOp(),
766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CpuOp(),
776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new SchedulerOp(),
786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new GcOp(),
796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateFileOp(),
806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteFileOp(),
816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new CreateWriteSyncFileOp(),
826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new WriteFileOp(),
836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(), new ReadFileOp(),
846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(), new NoOp(),
856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(), new NoOp(),
866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(), new NoOp(),
876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new NoOp(),
886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new NoOp(),
896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteFileOp(),
906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteFileOp(),
916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new CreateWriteSyncFileOp(),
926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new CreateWriteSyncFileOp(),
936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new WriteFileOp(),
946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(), new ReadFileOp(),
956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new WriteFileOp(),
966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(), new ReadFileOp(),
976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(), new NoOp(),
986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(), new NoOp(),
996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(), new NoOp(),
1006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(), new NoOp(),
1016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(), new NoOp(),
1026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(), new NoOp(),
1036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(), new NoOp(),
1046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(), new NoOp(),
1056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(), new NoOp(),
1066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(), new NoOp(),
1076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(), new NoOp(),
1086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(), new NoOp(),
1096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(), new NoOp(),
1106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(), new NoOp(),
1116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(), new NoOp(),
1126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(), new NoOp(),
1136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(), new NoOp(),
1146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final static Op[] mAvailOps = new Op[] {
1176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            null,
1186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new NoOp(),
1196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CpuOp(),
1206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new SchedulerOp(),
1216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new MethodCallOp(),
1224c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new GcOp(),
1234c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new ObjectGcOp(),
1244c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new FinalizingGcOp(),
1254c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            new PaintGcOp(),
1266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new IpcOp(),
1276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateFileOp(),
1286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteFileOp(),
1296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateWriteSyncFileOp(),
1306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new WriteFileOp(),
1316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadFileOp(),
1326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new OpenXmlResOp(),
1336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ReadXmlAttrsOp(),
1346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseXmlResOp(),
1356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new ParseLargeXmlResOp(),
1366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterOp(),
1376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterLargeOp(),
1386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterViewOp(),
1396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterButtonOp(),
1406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LayoutInflaterImageButtonOp(),
1416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateBitmapOp(),
1426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new CreateRecycleBitmapOp(),
1436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallBitmapOp(),
1446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleSmallBitmapOp(),
1456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeBitmapOp(),
1466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadRecycleLargeBitmapOp(),
1476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadSmallScaledBitmapOp(),
1486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            new LoadLargeScaledBitmapOp(),
149f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowTinyHashMapOp(),
150f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowTinyArrayMapOp(),
151f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowSmallHashMapOp(),
152f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowSmallArrayMapOp(),
153f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowLargeHashMapOp(),
154f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new GrowLargeArrayMapOp(),
155f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupTinyHashMapOp(),
156f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupTinyArrayMapOp(),
157f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupSmallHashMapOp(),
158f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupSmallArrayMapOp(),
159f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupLargeHashMapOp(),
160f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new LookupLargeArrayMapOp(),
1616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_START_TEST = 1;
1646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int CMD_TERMINATE = 2;
165dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
166dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final int MSG_REALLY_START = 1000;
167dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final int MSG_REALLY_TERMINATE = 1001;
168dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
1696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TEST_FINISHED = 1;
1706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static final int RES_TERMINATED = 2;
1716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final Handler mHandler = new Handler() {
1736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void handleMessage(Message msg) {
1746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            switch (msg.what) {
1756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_START_TEST: {
176dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    // Give a little time for things to settle down.
177dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    Message newMsg = Message.obtain(null, MSG_REALLY_START);
178dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.obj = msg.obj;
179dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.replyTo = msg.replyTo;
180dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    sendMessageDelayed(newMsg, 500);
181dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
182dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                case MSG_REALLY_START: {
1836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Bundle bundle = (Bundle)msg.obj;
1846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    bundle.setClassLoader(getClassLoader());
1856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final TestArgs args = (TestArgs)bundle.getParcelable("args");
1866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    final Messenger replyTo = msg.replyTo;
1876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mRunner.run(this, args, new Runnable() {
1886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
1896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (replyTo != null) {
1906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Message msg = Message.obtain(null, RES_TEST_FINISHED);
1916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                Bundle bundle = new Bundle();
1926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                bundle.putParcelable("res", new RunResult(mRunner));
1936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                msg.obj = bundle;
1946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                try {
1956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                    replyTo.send(msg);
1966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                } catch (RemoteException e) {
1976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                }
1986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
1996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
2006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
2016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } break;
2026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case CMD_TERMINATE: {
203dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    // Give a little time for things to settle down.
204dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    Message newMsg = Message.obtain(null, MSG_REALLY_TERMINATE);
205dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.obj = msg.obj;
206dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    newMsg.replyTo = msg.replyTo;
207dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    sendMessageDelayed(newMsg, 50);
208dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
209dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                case MSG_REALLY_TERMINATE: {
2106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (msg.replyTo != null) {
2116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        Message reply = Message.obtain(null, RES_TERMINATED);
2126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        try {
2136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            msg.replyTo.send(reply);
2146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        } catch (RemoteException e) {
2156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
2166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
2176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    terminate();
218dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                } break;
2196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
2226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final TestRunner mRunner = new TestRunner();
2246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    @Override
2266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public IBinder onBind(Intent intent) {
2276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        return (new Messenger(mHandler)).getBinder();
2286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
2296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void terminate() {
231dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        Runtime.getRuntime().exit(0);
2326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
2336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    enum BackgroundMode {
2356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NOTHING,
2366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CPU,
2376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SCHEDULER
2386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
2396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    public class TestRunner {
2416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Handler mHandler;
2426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mMaxRunTime;
24380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        long mMaxOps;
2446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mForegroundOp;
2456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Op mBackgroundOp;
2466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Runnable mDoneCallback;
2476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mBackgroundThread;
2496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread mForegroundThread;
2506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mStartTime;
2516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mBackgroundRunning;
2536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean mForegroundRunning;
2546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundEndTime;
2566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mBackgroundOps;
2576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundEndTime;
2586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        long mForegroundOps;
2596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public TestRunner() {
2616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundName() {
2646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getName();
2656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundName() {
2686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getName();
2696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
2726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String fgName = mForegroundOp.getName();
2736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            String bgName = mBackgroundOp.getName();
2746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            StringBuilder res = new StringBuilder();
2756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (fgName != null) {
2766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(fgName);
2776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Fg");
2786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (bgName != null) {
2806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append(bgName);
2816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                res.append("Bg");
2826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return res.toString();
2846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getForegroundLongName() {
2876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOp.getLongName();
2886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getBackgroundLongName() {
2916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOp.getLongName();
2926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run(Handler handler, TestArgs args, Runnable doneCallback) {
2956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler = handler;
2966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mMaxRunTime = args.maxTime;
29780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            mMaxOps = args.maxOps;
2986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (args.combOp >= 0) {
2996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mOpPairs[args.combOp];
3006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mOpPairs[args.combOp+1];
3016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
3026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundOp = mAvailOps[args.fgOp];
3036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundOp = mAvailOps[args.bgOp];
3046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mDoneCallback = doneCallback;
3066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread = new RunnerThread("background", new Runnable() {
3076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
3086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
3096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
3106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
3116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mBackgroundOp.onRun();
3126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
3136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(running, true) && running);
3146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundEndTime = SystemClock.uptimeMillis();
3156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundOps = ops * mBackgroundOp.getOpsPerRun();
3166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(false);
3176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_BACKGROUND);
319df7221ced3b7cd807f14e84c302fc09fd659fd68Dianne Hackborn            mForegroundThread = new RunnerThread("foreground", new Runnable() {
3206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                @Override public void run() {
3216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    boolean running;
3226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    int ops = 0;
3236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    do {
3246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        running = mForegroundOp.onRun();
3256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        ops++;
3266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    } while (evalRepeat(true, running) && running);
3276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundEndTime = SystemClock.uptimeMillis();
3286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundOps = ops * mForegroundOp.getOpsPerRun();
3296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    threadFinished(true);
3306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }, Process.THREAD_PRIORITY_FOREGROUND);
3326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundOp.onInit(TestService.this, true);
3346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundOp.onInit(TestService.this, false);
3356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mStartTime = SystemClock.uptimeMillis();
3386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBackgroundRunning = true;
3396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mForegroundRunning = true;
3406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBackgroundThread.start();
3436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mForegroundThread.start();
3446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundTime() {
3476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundEndTime-mStartTime;
3486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getForegroundOps() {
3516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mForegroundOps;
3526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundTime() {
3556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundEndTime-mStartTime;
3566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public long getBackgroundOps() {
3596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mBackgroundOps;
3606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private boolean evalRepeat(boolean bgRunning, boolean fgRunning) {
3636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!bgRunning) {
3656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!fgRunning) {
3686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    return false;
3726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
37380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                if (mMaxOps > 0) {
37480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    // iteration-limited case
37580a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    if (mForegroundOps >= mMaxOps) {
37680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                        return false;
37780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    }
37880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    mForegroundOps++;
37980a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                } else {
38080a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    // time-limited case
38180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    long now = SystemClock.uptimeMillis();
38280a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    if (now > (mStartTime+mMaxRunTime)) {
38380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                        return false;
38480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    }
3856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return true;
3876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private void threadFinished(boolean foreground) {
3916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            synchronized (this) {
3926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (foreground) {
3936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mForegroundRunning = false;
3946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } else {
3956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mBackgroundRunning = false;
3966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
3976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                if (!mBackgroundRunning && !mForegroundRunning) {
3986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    mHandler.post(new Runnable() {
3996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        @Override public void run() {
4006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mForegroundOp.onTerm(TestService.this);
4016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            mBackgroundOp.onTerm(TestService.this);
4026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            if (mDoneCallback != null) {
4036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                                mDoneCallback.run();
4046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            }
4056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
4066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    });
4076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                }
4086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
4096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    class RunnerThread extends Thread {
4136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final Runnable mOp;
4146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        private final int mPriority;
4156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RunnerThread(String name, Runnable op, int priority) {
4176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(name);
4186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp = op;
4196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPriority = priority;
4206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public void run() {
4236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(mPriority);
4246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mOp.run();
4256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static public abstract class Op {
4296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mName;
4306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        final String mLongName;
4316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public Op(String name, String longName) {
4336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mName = name;
4346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLongName = longName;
4356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getName() {
4386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mName;
4396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        public String getLongName() {
4426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return mLongName;
4436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
4466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        abstract boolean onRun();
4496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
4516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 1;
4556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class NoOp extends Op {
4596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        NoOp() {
4606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super(null, "Nothing");
4616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return false;
4656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
4686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
4696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CpuOp extends Op {
4736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CpuOp() {
4746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CPU", "Consume CPU");
4756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class SchedulerOp extends Op {
4836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        SchedulerOp() {
4846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Sched", "Change scheduler group");
4856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
4886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
4896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
4916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
4936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class GcOp extends Op {
4956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        GcOp() {
4966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Gc", "Run garbage collector");
4976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
4986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
4996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            byte[] stuff = new byte[1024*1024];
5016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5054c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class ObjectGcOp extends Op {
5064c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        ObjectGcOp() {
5074c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("ObjectGc", "Run garbage collector with simple objects");
5084c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5094c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5104c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5114c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Object obj = new Object();
5124c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5134c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5144c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5154c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5164c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class FinalizingGcOp extends Op {
5174c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        class Finalizable {
5184c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable() {}
5194c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            @Override
5204c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            protected void finalize() throws Throwable {
5214c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate                super.finalize();
5224c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            }
5234c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5244c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5254c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        FinalizingGcOp() {
5264c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("FinalizingGc", "Run garbage collector with finalizable objects");
5274c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5284c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5294c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5304c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Finalizable obj = new Finalizable();
5314c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5324c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5334c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5344c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5354c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    static class PaintGcOp extends Op {
5364c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        PaintGcOp() {
5374c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            super("PaintGc", "Run garbage collector with Paint objects");
5384c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5394c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5404c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        boolean onRun() {
5414c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            Paint p = new Paint();
5424c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate            return true;
5434c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate        }
5444c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate    }
5454c18ad56f7e9b84bb075fd39c8e712c7871430a0Christopher Tate
5466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class MethodCallOp extends Op {
5476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        MethodCallOp() {
5486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("MethodCall", "Method call");
5496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                someFunc(i);
5556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int someFunc(int foo) {
5606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 0;
5616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 500;
5656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class IpcOp extends Op {
5696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        PackageManager mPm;
5706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        String mProcessName;
5716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        IpcOp() {
5736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("Ipc", "IPC to system process");
5746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
5776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mPm = context.getPackageManager();
5786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mProcessName = context.getApplicationInfo().processName;
5796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
5826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            final int N = getOpsPerRun();
5836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<N; i++) {
5846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mPm.queryContentProviders(mProcessName, Process.myUid(), 0);
5856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
5866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
5876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        int getOpsPerRun() {
5906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return 100;
5916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
5926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
5936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class OpenXmlResOp extends Op {
5956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
5966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
5976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        OpenXmlResOp() {
5986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("OpenXmlRes", "Open (and close) an XML resource");
5996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            XmlResourceParser parser = mContext.getResources().getLayout(R.xml.simple);
6076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            parser.close();
6086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadXmlAttrsOp extends Op {
6136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        XmlResourceParser mParser;
6156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        AttributeSet mAttrs;
6166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadXmlAttrsOp() {
6186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadXmlAttrs", "Read attributes from an XML tag");
6196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser = mContext.getResources().getLayout(R.xml.simple);
6246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mAttrs = Xml.asAttributeSet(mParser);
6256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            int eventType;
6276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
6286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                // Find the first <item> tag.
6296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                eventType = mParser.getEventType();
6306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                String tagName;
6316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                do {
6326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    if (eventType == XmlPullParser.START_TAG) {
6336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        tagName = mParser.getName();
6346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        if (tagName.equals("item")) {
6356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                            break;
6366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                        }
6376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    }
6386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    eventType = mParser.next();
6396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } while (eventType != XmlPullParser.END_DOCUMENT);
6406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (XmlPullParserException e) {
6416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
6436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                throw new RuntimeException("I died", e);
6446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
6456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
6486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mParser.close();
6496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TypedArray a = mContext.obtainStyledAttributes(mAttrs,
6536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    com.android.internal.R.styleable.MenuItem);
6546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            a.recycle();
6556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseXmlResOp extends Op {
6606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseXmlResOp() {
6636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseXmlRes", "Parse compiled XML resource");
6646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple);
6736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ParseLargeXmlResOp extends Op {
6786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ParseLargeXmlResOp() {
6816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ParseLargeXmlRes", "Parse large XML resource");
6826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
6856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
6866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
6896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            SimpleInflater inf = new SimpleInflater(mContext);
6906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.xml.simple_large);
6916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
6926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
6936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
6946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterOp extends Op {
6966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
6976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
6986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterOp() {
6996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflater", "Inflate layout resource");
7006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.small_layout, null);
7136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterLargeOp extends Op {
7186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterLargeOp() {
7216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterLarge", "Inflate large layout resource");
7226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.large_layout, null);
7356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterViewOp extends Op {
7406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterViewOp() {
7436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterView", "Inflate layout with 50 View objects");
7446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.view_layout, null);
7576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterButtonOp extends Op {
7626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterButtonOp() {
7656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterButton", "Inflate layout with 50 Button objects");
7666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
7786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.button_layout, null);
7796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
7806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
7826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LayoutInflaterImageButtonOp extends Op {
7846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
7856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LayoutInflaterImageButtonOp() {
7876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LayoutInflaterImageButton", "Inflate layout with 50 ImageButton objects");
7886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
7916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
7926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
7936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
7946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
7956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (Looper.myLooper() == null) {
7966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Looper.prepare();
7976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
7986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            LayoutInflater inf = (LayoutInflater)mContext.getSystemService(
7996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Context.LAYOUT_INFLATER_SERVICE);
8006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            inf.inflate(R.layout.image_button_layout, null);
8016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateBitmapOp extends Op {
8066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateBitmapOp() {
8096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateBitmap", "Create a Bitmap");
8106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
8206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateRecycleBitmapOp extends Op {
8256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateRecycleBitmapOp() {
8286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateRecycleBitmap", "Create and recycle a Bitmap");
8296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = Bitmap.createBitmap(16, 16, Bitmap.Config.ARGB_8888);
8396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallBitmapOp extends Op {
8456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallBitmapOp() {
8486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallBitmap", "Load small raw bitmap");
8496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleSmallBitmapOp extends Op {
8656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleSmallBitmapOp() {
8686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleSmallBitmap", "Load and recycle small raw bitmap");
8696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
8796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample, opts);
8806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
8816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
8826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
8846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeBitmapOp extends Op {
8866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
8876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeBitmapOp() {
8896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeBitmap", "Load large raw bitmap");
8906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
8936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
8946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
8956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
8966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
8976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
8986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
8996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
9016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadRecycleLargeBitmapOp extends Op {
9066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadRecycleLargeBitmapOp() {
9096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadRecycleLargeBitmap", "Load and recycle large raw bitmap");
9106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate, opts);
9216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bm.recycle();
9226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadSmallScaledBitmapOp extends Op {
9276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadSmallScaledBitmapOp() {
9306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadSmallScaledBitmap", "Load small raw bitmap that is scaled for density");
9316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.stat_sample_scale, opts);
9426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class LoadLargeScaledBitmapOp extends Op {
9476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Context mContext;
9486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        LoadLargeScaledBitmapOp() {
9506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("LoadLargeScaledBitmap", "Load large raw bitmap that is scaled for density");
9516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mContext = context;
9556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            BitmapFactory.Options opts = new BitmapFactory.Options();
9596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE;
9606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(),
9616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    R.drawable.wallpaper_goldengate_scale, opts);
9626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateFileOp extends Op {
9676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateFileOp() {
9706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateFile", "Create and delete a file");
9716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
9796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
9806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mFile.createNewFile();
9816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
9826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
9836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
9846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
9866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
9886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteFileOp extends Op {
9906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
9916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteFileOp() {
9936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteFile", "Create, write, and delete a file");
9946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
9956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
9966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
9976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
9986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
9996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
10046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
10056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
10066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class CreateWriteSyncFileOp extends Op {
10156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        CreateWriteSyncFileOp() {
10186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("CreateWriteSyncFile", "Create, write, sync, and delete a file");
10196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileOutputStream fos = new FileOutputStream(mFile);
10296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.write(1);
10306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.flush();
10316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                FileUtils.sync(fos);
10326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                fos.close();
10336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class WriteFileOp extends Op {
10426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10436b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10446b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10456b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10466b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        WriteFileOp() {
10476b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("WriteFile", "Truncate and write a 64k file");
10486b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10556b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
10566b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10576b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
10596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (FileNotFoundException e) {
10606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
10616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
10656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
10676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
10686b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
10696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure writing " + mFile, e);
10716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
10736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
10766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
10776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
10786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
10796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
10806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
10826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
10846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10856b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    static class ReadFileOp extends Op {
10866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        File mFile;
10876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        RandomAccessFile mRAF;
10886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        byte[] mBuffer;
10896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        ReadFileOp() {
10916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            super("ReadFile", "Seek and read a 64k file");
10926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
10936b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
10946b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onInit(Context context, boolean foreground) {
10956b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mBuffer = new byte[1024*64];
10966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            for (int i=0; i<mBuffer.length; i++) {
10976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBuffer[i] = (byte)i;
10986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
10996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile = context.getFileStreamPath(foreground ? "test-fg.file" : "test-bg.file");
11006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
11016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
11026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF = new RandomAccessFile(mFile, "rw");
11036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
11046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.setLength(0);
11056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.write(mBuffer);
11066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
11076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure creating " + mFile, e);
11086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
11116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        boolean onRun() {
11126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
11136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.seek(0);
11146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.read(mBuffer);
11156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
11166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure reading " + mFile, e);
11176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return true;
11196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
11216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        void onTerm(Context context) {
11226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            try {
11236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mRAF.close();
11246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } catch (IOException e) {
11256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Log.w(TAG, "Failure closing " + mFile, e);
11266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
11276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mFile.delete();
11286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
11296b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
1130f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1131f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static abstract class GenericMapOp extends Op {
1132f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        final int mSize;
1133f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        String[] mKeys;
1134f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        String[] mValues;
1135f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1136f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GenericMapOp(String name, String longName, int size) {
1137f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super(name, longName);
1138f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mSize = size;
1139f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1140f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1141f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        void onInit(Context context, boolean foreground) {
1142f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mKeys = new String[mSize];
1143f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mValues = new String[mSize];
1144f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            Random random = new Random(0);
1145f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1146f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                int chars = random.nextInt(10);
1147f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                StringBuilder builder = new StringBuilder(chars);
1148f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                for (int j=0; j<chars; j++) {
1149f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                    builder.append('a' + random.nextInt(100));
1150f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                }
1151f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mKeys[i] = builder.toString();
1152f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mValues[i] = Integer.toString(i);
1153f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1154f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1155f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1156f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        int getOpsPerRun() {
1157f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return mSize;
1158f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1159f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1160f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1161f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowTinyHashMapOp extends GenericMapOp {
1162f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowTinyHashMapOp() {
1163f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowTinyHashMap", "Add 5 items to a HashMap", 5);
1164f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1165f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1166f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1167f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            HashMap<String, String> map = new HashMap<String, String>();
1168f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1169f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1170f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1171f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1172f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1173f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1174f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1175f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowTinyArrayMapOp extends GenericMapOp {
1176f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowTinyArrayMapOp() {
1177f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowTinyArrayMap", "Add 5 items to a ArrayMap", 5);
1178f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1179f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1180f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1181f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            ArrayMap<String, String> map = new ArrayMap<String, String>();
1182f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1183f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1184f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1185f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1186f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1187f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1188f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1189f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowSmallHashMapOp extends GenericMapOp {
1190f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowSmallHashMapOp() {
1191f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowSmallHashMap", "Add 100 items to a HashMap", 100);
1192f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1193f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1194f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1195f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            HashMap<String, String> map = new HashMap<String, String>();
1196f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1197f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1198f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1199f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1200f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1201f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1202f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1203f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowSmallArrayMapOp extends GenericMapOp {
1204f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowSmallArrayMapOp() {
1205f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowSmallArrayMap", "Add 100 items to a ArrayMap", 100);
1206f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1207f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1208f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1209f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            ArrayMap<String, String> map = new ArrayMap<String, String>();
1210f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1211f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1212f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1213f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1214f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1215f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1216f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1217f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowLargeHashMapOp extends GenericMapOp {
1218f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowLargeHashMapOp() {
1219f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowLargeHashMap", "Add 10000 items to a HashMap", 10000);
1220f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1221f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1222f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1223f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            HashMap<String, String> map = new HashMap<String, String>();
1224f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1225f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1226f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1227f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1228f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1229f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1230f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1231f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class GrowLargeArrayMapOp extends GenericMapOp {
1232f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        GrowLargeArrayMapOp() {
1233f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("GrowLargeArrayMap", "Add 10000 items to a ArrayMap", 10000);
1234f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1235f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1236f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1237f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            ArrayMap<String, String> map = new ArrayMap<String, String>();
1238f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1239f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                map.put(mKeys[i], mValues[i]);
1240f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1241f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1242f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1243f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1244f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1245f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupTinyHashMapOp extends LookupSmallHashMapOp {
1246f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupTinyHashMapOp() {
1247f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupTinyHashMap", "Lookup items in 5 entry HashMap", 5);
1248f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1249f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1250f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1251f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupTinyArrayMapOp extends LookupSmallArrayMapOp {
1252f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupTinyArrayMapOp() {
1253f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupTinyArrayMap", "Lookup items in 5 entry ArrayMap", 5);
1254f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1255f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1256f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1257f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupSmallHashMapOp extends GenericMapOp {
1258f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        HashMap<String, String> mHashMap;
1259f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1260f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupSmallHashMapOp() {
1261f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupSmallHashMap", "Lookup items in 100 entry HashMap", 100);
1262f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1263f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1264f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupSmallHashMapOp(String name, String longname, int size) {
1265f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super(name, longname, size);
1266f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1267f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1268f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        void onInit(Context context, boolean foreground) {
1269f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super.onInit(context, foreground);
1270f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mHashMap = new HashMap<String, String>();
1271f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1272f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mHashMap.put(mKeys[i], mValues[i]);
1273f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1274f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1275f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1276f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1277f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1278f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mHashMap.get(mKeys[i]);
1279f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1280f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1281f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1282f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1283f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1284f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupSmallArrayMapOp extends GenericMapOp {
1285f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        ArrayMap<String, String> mArrayMap;
1286f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1287f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupSmallArrayMapOp() {
1288f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupSmallArrayMap", "Lookup items in 100 entry ArrayMap", 100);
1289f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1290f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1291f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupSmallArrayMapOp(String name, String longname, int size) {
1292f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super(name, longname, size);
1293f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1294f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1295f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        void onInit(Context context, boolean foreground) {
1296f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super.onInit(context, foreground);
1297f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            mArrayMap = new ArrayMap<String, String>();
1298f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1299f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mArrayMap.put(mKeys[i], mValues[i]);
1300f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1301f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1302f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1303f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        boolean onRun() {
1304f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            for (int i=0; i<mSize; i++) {
1305f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn                mArrayMap.get(mKeys[i]);
1306f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            }
1307f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            return true;
1308f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1309f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1310f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1311f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupLargeHashMapOp extends LookupSmallHashMapOp {
1312f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupLargeHashMapOp() {
1313f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupLargeHashMap", "Lookup items in 10000 entry HashMap", 10000);
1314f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1315f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
1316f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn
1317f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    static class LookupLargeArrayMapOp extends LookupSmallArrayMapOp {
1318f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        LookupLargeArrayMapOp() {
1319f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            super("LookupLargeArrayMap", "Lookup items in 10000 entry ArrayMap", 10000);
1320f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        }
1321f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn    }
13226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn}
1323