1d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn/*
2d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
3d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn *
4d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * you may not use this file except in compliance with the License.
6d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * You may obtain a copy of the License at
7d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn *
8d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn *
10d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * See the License for the specific language governing permissions and
14d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * limitations under the License.
15d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn */
16d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
17d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornpackage com.android.frameworkperf;
18d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
19d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.app.Activity;
206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.ComponentName;
21d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.content.Intent;
226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.content.ServiceConnection;
23dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackbornimport android.os.Binder;
24d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.os.Bundle;
25d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.os.Handler;
266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.IBinder;
276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Message;
286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.Messenger;
29d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.os.PowerManager;
306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.os.RemoteException;
31d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.util.Log;
32d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.view.View;
33d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.view.WindowManager;
342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackbornimport android.widget.AdapterView;
352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackbornimport android.widget.ArrayAdapter;
3628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackbornimport android.widget.Button;
376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackbornimport android.widget.CheckBox;
382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackbornimport android.widget.Spinner;
39d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport android.widget.TextView;
40d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
41d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackbornimport java.util.ArrayList;
42d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
43d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn/**
44d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn * So you thought sync used up your battery life.
45d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn */
462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackbornpublic class FrameworkPerfActivity extends Activity
472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        implements AdapterView.OnItemSelectedListener {
482e9562ad760d320b97e710c60427ff1704283c82Dianne Hackborn    static final String TAG = "Perf";
49dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final boolean DEBUG = false;
502e9562ad760d320b97e710c60427ff1704283c82Dianne Hackborn
512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    Spinner mFgSpinner;
522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    Spinner mBgSpinner;
5380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate    Spinner mLimitSpinner;
5480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate    TextView mLimitLabel;
550500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn    TextView mTestTime;
5628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    Button mStartButton;
5728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    Button mStopButton;
586b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    CheckBox mLocalCheckBox;
5928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn    TextView mLog;
60d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    PowerManager.WakeLock mPartialWakeLock;
61d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
62d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    long mMaxRunTime = 5000;
6380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate    boolean mLimitIsIterations;
64d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    boolean mStarted;
65d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    final String[] mAvailOpLabels;
672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    final String[] mAvailOpDescriptions;
6880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate    final String[] mLimitLabels = { "Time", "Iterations" };
692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    int mFgTestIndex = -1;
716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    int mBgTestIndex = -1;
726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    TestService.Op mFgTest;
736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    TestService.Op mBgTest;
74d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    int mCurOpIndex = 0;
756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    TestConnection mCurConnection;
76dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    boolean mConnectionBound;
77d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final ArrayList<RunResult> mResults = new ArrayList<RunResult>();
79d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
805eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu    Object mResultNotifier = new Object();
815eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu
82dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    class TestConnection implements ServiceConnection, IBinder.DeathRecipient {
836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Messenger mService;
84dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        boolean mLinked;
85d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void onServiceConnected(ComponentName name, IBinder service) {
87dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            try {
88dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                if (!(service instanceof Binder)) {
89dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    // If remote, we'll be killing ye.
90dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    service.linkToDeath(this, 0);
91dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    mLinked = true;
92dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                }
93dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                mService = new Messenger(service);
94dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                dispatchCurOp(this);
95dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            } catch (RemoteException e) {
96dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                // Whoops, service has disappeared...  try starting again.
97dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                Log.w(TAG, "Test service died, starting again");
98dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                startCurOp();
99dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
100d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
101d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
1026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void onServiceDisconnected(ComponentName name) {
103d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
104dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
105dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        @Override public void binderDied() {
106dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            cleanup();
107dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            connectionDied(this);
108dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        }
109dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
110dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        void cleanup() {
111dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (mLinked) {
112dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                mLinked = false;
113dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                mService.getBinder().unlinkToDeath(this, 0);
114dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
115dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        }
116d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
117d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
118dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    static final int MSG_DO_NEXT_TEST = 1000;
1196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1206b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final Handler mHandler = new Handler() {
1216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        @Override public void handleMessage(Message msg) {
1226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            switch (msg.what) {
1236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                case TestService.RES_TEST_FINISHED: {
1246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    Bundle bundle = (Bundle)msg.obj;
1256b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    bundle.setClassLoader(getClassLoader());
1266b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    RunResult res = (RunResult)bundle.getParcelable("res");
1276b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    completeCurOp(res);
1286b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } break;
129dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                case MSG_DO_NEXT_TEST: {
1306b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                    startCurOp();
1316b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } break;
1326b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
1336b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
1346b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    };
1356b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
1366b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    final Messenger mMessenger = new Messenger(mHandler);
137d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
1382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    public FrameworkPerfActivity() {
1396b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        mAvailOpLabels = new String[TestService.mAvailOps.length];
1406b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        mAvailOpDescriptions = new String[TestService.mAvailOps.length];
1416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        for (int i=0; i<TestService.mAvailOps.length; i++) {
1426b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TestService.Op op = TestService.mAvailOps[i];
1430500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn            if (op == null) {
1442c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mAvailOpLabels[i] = "All";
1452c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mAvailOpDescriptions[i] = "All tests";
1462c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            } else {
1472c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mAvailOpLabels[i] = op.getName();
1480500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn                if (mAvailOpLabels[i] == null) {
1490500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn                    mAvailOpLabels[i] = "Nothing";
1500500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn                }
1512c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mAvailOpDescriptions[i] = op.getLongName();
1522c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
1532c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
1542c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    }
1552c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
156d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    @Override
157d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
158d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        super.onCreate(savedInstanceState);
159d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
160d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        // Set the layout for this activity.  You can find it
161d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        // in res/layout/hello_activity.xml
162d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        setContentView(R.layout.main);
163d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
1642c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mFgSpinner = (Spinner) findViewById(R.id.fgspinner);
1652c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
1662c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                android.R.layout.simple_spinner_item, mAvailOpLabels);
1672c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
1682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mFgSpinner.setAdapter(adapter);
1692c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mFgSpinner.setOnItemSelectedListener(this);
1702c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mBgSpinner = (Spinner) findViewById(R.id.bgspinner);
1712c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        adapter = new ArrayAdapter<String>(this,
1722c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                android.R.layout.simple_spinner_item, mAvailOpLabels);
1732c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
1742c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mBgSpinner.setAdapter(adapter);
1752c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        mBgSpinner.setOnItemSelectedListener(this);
17680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        mLimitSpinner = (Spinner) findViewById(R.id.limitspinner);
17780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        adapter = new ArrayAdapter<String>(this,
17880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                android.R.layout.simple_spinner_item, mLimitLabels);
17980a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
18080a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        mLimitSpinner.setAdapter(adapter);
18180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        mLimitSpinner.setOnItemSelectedListener(this);
1822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
18328695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mTestTime = (TextView)findViewById(R.id.testtime);
18480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        mLimitLabel = (TextView)findViewById(R.id.limitlabel);
18528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn
18628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mStartButton = (Button)findViewById(R.id.start);
18728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mStartButton.setOnClickListener(new View.OnClickListener() {
188d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            @Override public void onClick(View v) {
189d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn                startRunning();
190d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
191d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        });
19228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mStopButton = (Button)findViewById(R.id.stop);
19328695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mStopButton.setOnClickListener(new View.OnClickListener() {
194d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            @Override public void onClick(View v) {
195d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn                stopRunning();
196d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
197d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        });
19828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn        mStopButton.setEnabled(false);
1996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        mLocalCheckBox = (CheckBox)findViewById(R.id.local);
20028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn
201d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        mLog = (TextView)findViewById(R.id.log);
202d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
203d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
204d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Scheduler");
205d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        mPartialWakeLock.setReferenceCounted(false);
206d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
207d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
208d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    @Override
2092c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
21080a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        if (parent == mFgSpinner || parent == mBgSpinner || parent == mLimitSpinner) {
2116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            TestService.Op op = TestService.mAvailOps[position];
2122c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (parent == mFgSpinner) {
2136b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mFgTestIndex = position;
2142c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mFgTest = op;
2152c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                ((TextView)findViewById(R.id.fgtext)).setText(mAvailOpDescriptions[position]);
21680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            } else if (parent == mBgSpinner) {
2176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                mBgTestIndex = position;
2182c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                mBgTest = op;
2192c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                ((TextView)findViewById(R.id.bgtext)).setText(mAvailOpDescriptions[position]);
22080a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            } else if (parent == mLimitSpinner) {
22180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                mLimitIsIterations = (position != 0);
22280a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                if (mLimitIsIterations) {
22380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    mLimitLabel.setText("Iterations: ");
22480a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                } else {
22580a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                    mLimitLabel.setText("Test time (ms): ");
22680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate                }
2272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
2282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
2292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    }
2302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
2312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    @Override
2322c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    public void onNothingSelected(AdapterView<?> parent) {
2332c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    }
2342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
2352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    @Override
236d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    public void onResume() {
237d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        super.onResume();
238d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
239d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
240d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    @Override
241d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    public void onDestroy() {
242d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        super.onDestroy();
243d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        stopRunning();
244d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        if (mPartialWakeLock.isHeld()) {
245d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            mPartialWakeLock.release();
246d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
247d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
248d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
2496b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void dispatchCurOp(TestConnection conn) {
2506b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mCurConnection != conn) {
2516b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Log.w(TAG, "Dispatching on invalid connection: " + conn);
2526b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return;
2536b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2546b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        TestArgs args = new TestArgs();
25580a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        if (mLimitIsIterations) {
25680a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            args.maxOps = mMaxRunTime;
25780a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        } else {
25880a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            args.maxTime = mMaxRunTime;
25980a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate        }
2606b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mFgTestIndex == 0 && mBgTestIndex == 0) {
2616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            args.combOp = mCurOpIndex;
2626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        } else if (mFgTestIndex != 0 && mBgTestIndex != 0) {
2636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            args.fgOp = mFgTestIndex;
2646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            args.bgOp = mBgTestIndex;
2656b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        } else {
26628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            // Skip null test.
26728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            if (mCurOpIndex == 0) {
26828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn                mCurOpIndex = 1;
26928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            }
2706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (mFgTestIndex != 0) {
2716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                args.fgOp = mFgTestIndex;
2726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                args.bgOp = mCurOpIndex;
2736b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
2746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                args.fgOp = mCurOpIndex;
2756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                args.bgOp = mFgTestIndex;
2766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
2776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Bundle bundle = new Bundle();
2796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        bundle.putParcelable("args", args);
2806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        Message msg = Message.obtain(null, TestService.CMD_START_TEST, bundle);
2816b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        msg.replyTo = mMessenger;
2826b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        try {
2836b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            conn.mService.send(msg);
2846b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        } catch (RemoteException e) {
285dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            Log.w(TAG, "Failure communicating with service", e);
2866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
2876b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
2886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
2896b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void completeCurOp(RunResult result) {
2906b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        log(String.format("%s: fg=%d*%gms/op (%dms) / bg=%d*%gms/op (%dms)",
2916b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                result.name, result.fgOps, result.getFgMsPerOp(), result.fgTime,
2926b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                result.bgOps, result.getBgMsPerOp(), result.bgTime));
2935eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu        synchronized (mResults) {
2945eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            mResults.add(result);
2955eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu        }
2966b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (!mStarted) {
2976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            log("Stop");
2986b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            stopRunning();
2996b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return;
3006b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3016b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mFgTest != null && mBgTest != null) {
3026b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            log("Finished");
3036b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            stopRunning();
3046b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            return;
3056b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3066b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mFgTest == null && mBgTest == null) {
3076b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mCurOpIndex+=2;
3086b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (mCurOpIndex >= TestService.mOpPairs.length) {
3096b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                log("Finished");
3106b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                stopRunning();
3116b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return;
3126b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
3132c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        } else {
3146b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mCurOpIndex++;
3156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (mCurOpIndex >= TestService.mAvailOps.length) {
3166b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                log("Finished");
3176b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                stopRunning();
3186b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                return;
31928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            }
3202c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
3216b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        startCurOp();
3226b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3236b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3246b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void disconnect() {
325dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        final TestConnection conn = mCurConnection;
326dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        if (conn != null) {
327dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (DEBUG) {
328dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                RuntimeException here = new RuntimeException("here");
329dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                here.fillInStackTrace();
330dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                Log.i(TAG, "Unbinding " + conn, here);
331dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
332dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (mConnectionBound) {
333dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                unbindService(conn);
334dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                mConnectionBound = false;
335dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
336dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (conn.mLinked) {
3376b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                Message msg = Message.obtain(null, TestService.CMD_TERMINATE);
3386b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                try {
339dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    conn.mService.send(msg);
340dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    return;
3416b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                } catch (RemoteException e) {
342dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                    Log.w(TAG, "Test service aleady died when terminating");
343d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn                }
344d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
345dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            conn.cleanup();
346dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        }
347dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        connectionDied(conn);
348dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    }
349dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn
350dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn    void connectionDied(TestConnection conn) {
351dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        if (mCurConnection == conn) {
352dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            // Now that we know the test process has died, we can commence
353dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            // the next test.  Just give a little delay to allow the activity
354dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            // manager to know it has died as well (not a disaster if it hasn't
355dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            // yet, though).
356dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (mConnectionBound) {
357dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                unbindService(conn);
358dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
3596b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mCurConnection = null;
360dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            mHandler.sendMessageDelayed(Message.obtain(null, MSG_DO_NEXT_TEST), 100);
3616b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3626b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    }
3636b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn
3646b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn    void startCurOp() {
365dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn        if (DEBUG) Log.i(TAG, "startCurOp: mCurConnection=" + mCurConnection);
3666b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mCurConnection != null) {
3676b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            disconnect();
368dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            return;
3696b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
3706b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        if (mStarted) {
3716b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler.removeMessages(TestService.RES_TEST_FINISHED);
3726b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mHandler.removeMessages(TestService.RES_TERMINATED);
373dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            mHandler.removeMessages(MSG_DO_NEXT_TEST);
3746b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mCurConnection = new TestConnection();
3756b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            Intent intent;
3766b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            if (mLocalCheckBox.isChecked()) {
3776b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                intent = new Intent(this, LocalTestService.class);
3786b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            } else {
3796b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn                intent = new Intent(this, TestService.class);
3806b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            }
381dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            if (DEBUG) {
382dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                RuntimeException here = new RuntimeException("here");
383dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                here.fillInStackTrace();
384dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn                Log.i(TAG, "Binding " + mCurConnection, here);
385dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            }
3866b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            bindService(intent, mCurConnection, BIND_AUTO_CREATE|BIND_IMPORTANT);
387dd13793a257f4d7265bba33937bb442722d5d36bDianne Hackborn            mConnectionBound = true;
3886b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn        }
389d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
390d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
391d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    void startRunning() {
392d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        if (!mStarted) {
393d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            log("Start");
394d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            mStarted = true;
39528695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mStartButton.setEnabled(false);
39628695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mStopButton.setEnabled(true);
3976b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLocalCheckBox.setEnabled(false);
39828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mTestTime.setEnabled(false);
39928695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mFgSpinner.setEnabled(false);
40028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mBgSpinner.setEnabled(false);
40180a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            mLimitSpinner.setEnabled(false);
402d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            updateWakeLock();
403d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            startService(new Intent(this, SchedulerService.class));
404d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            mCurOpIndex = 0;
4050500b3cfda5192efc09d6d4344b0c6c785c0a815Dianne Hackborn            mMaxRunTime = Integer.parseInt(mTestTime.getText().toString());
4065eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            synchronized (mResults) {
4075eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                mResults.clear();
4085eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            }
409d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            startCurOp();
410d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
411d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
412d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
413d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    void stopRunning() {
414d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        if (mStarted) {
4156b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            disconnect();
416d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            mStarted = false;
41728695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mStartButton.setEnabled(true);
41828695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mStopButton.setEnabled(false);
4196b57b7e4d568bfa6273f87ef4c9af2fdc0ca1a06Dianne Hackborn            mLocalCheckBox.setEnabled(true);
42028695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mTestTime.setEnabled(true);
42128695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mFgSpinner.setEnabled(true);
42228695e0c70db82e7ba0ce1c25ab10cc7fb04d40bDianne Hackborn            mBgSpinner.setEnabled(true);
42380a682bc3d1bdf1e756b799bbcd919678b319ee3Christopher Tate            mLimitSpinner.setEnabled(true);
424d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            updateWakeLock();
425d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            stopService(new Intent(this, SchedulerService.class));
4265eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            synchronized (mResults) {
4275eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                for (int i=0; i<mResults.size(); i++) {
4285eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    RunResult result = mResults.get(i);
4295eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    float fgMsPerOp = result.getFgMsPerOp();
4305eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    float bgMsPerOp = result.getBgMsPerOp();
4315eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    String fgMsPerOpStr = fgMsPerOp != 0 ? Float.toString(fgMsPerOp) : "";
4325eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    String bgMsPerOpStr = bgMsPerOp != 0 ? Float.toString(bgMsPerOp) : "";
4335eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                    Log.i("PerfRes", "\t" + result.name + "\t" + result.fgOps
4345eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                            + "\t" + result.getFgMsPerOp() + "\t" + result.fgTime
4355eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                            + "\t" + result.fgLongName + "\t" + result.bgOps
4365eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                            + "\t" + result.getBgMsPerOp() + "\t" + result.bgTime
4375eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                            + "\t" + result.bgLongName);
4385eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                }
4395eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            }
4405eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu            synchronized (mResultNotifier) {
4415eefd7711f63bc1b67ec927a8c43363f426121ccGuang Zhu                mResultNotifier.notifyAll();
442d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
443d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
444d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
445d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
446d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    void updateWakeLock() {
447d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        if (mStarted) {
448d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
449d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            if (!mPartialWakeLock.isHeld()) {
450d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn                mPartialWakeLock.acquire();
451d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
452d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        } else {
453d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
454d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            if (mPartialWakeLock.isHeld()) {
455d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn                mPartialWakeLock.release();
456d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn            }
457d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        }
458d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
459d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn
460d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    void log(String s) {
461d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn        mLog.setText(mLog.getText() + "\n" + s);
4622e9562ad760d320b97e710c60427ff1704283c82Dianne Hackborn        Log.i(TAG, s);
463d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn    }
464d4c4b76889f2bd2e2e34ba9fc835370020524dedDianne Hackborn}
465