1082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang/*
2082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * Copyright (C) 2017 The Android Open Source Project
3082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang *
4082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * Licensed under the Apache License, Version 2.0 (the "License");
5082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * you may not use this file except in compliance with the License.
6082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * You may obtain a copy of the License at
7082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang *
8082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang *      http://www.apache.org/licenses/LICENSE-2.0
9082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang *
10082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * Unless required by applicable law or agreed to in writing, software
11082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * distributed under the License is distributed on an "AS IS" BASIS,
12082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * See the License for the specific language governing permissions and
14082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang * limitations under the License.
15082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang */
16082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
17082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangpackage com.example.android.nn.benchmark;
18082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
19082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.app.Activity;
20082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.content.Intent;
21082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.os.Bundle;
22082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.os.Environment;
23082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.text.method.ScrollingMovementMethod;
24082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.util.Log;
25082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.view.Menu;
26082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.view.MenuInflater;
27082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.view.MenuItem;
28082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.view.View;
29082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.widget.ArrayAdapter;
30082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.widget.ListView;
31082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport android.widget.TextView;
32082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
33082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport java.io.BufferedWriter;
34082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport java.io.File;
35082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport java.io.FileWriter;
36082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport java.io.IOException;
37082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangimport java.util.ArrayList;
38082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
39082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wangpublic class NNControls extends Activity {
40082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public final String RESULT_FILE = "nn_benchmark_result.csv";
41082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
42082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private ListView mTestListView;
43082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private TextView mResultView;
44082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
45082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private ArrayAdapter<String> mTestListAdapter;
46082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private ArrayList<String> mTestList = new ArrayList<String>();
47082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
48082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private boolean mSettings[] = {false, false};
49082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private static final int SETTING_LONG_RUN = 0;
50082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private static final int SETTING_PAUSE = 1;
51082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
52082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private float mResults[];
53082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private String mInfo[];
54082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
55082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    @Override
56082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public boolean onCreateOptionsMenu(Menu menu) {
57082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        // Inflate the menu items for use in the action bar
58082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        MenuInflater inflater = getMenuInflater();
59082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        inflater.inflate(R.menu.main_activity_actions, menu);
60082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
61082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        return super.onCreateOptionsMenu(menu);
62082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
63082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
64082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    void init() {
65082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        for (int i=0; i < NNTestList.TestName.values().length; i++) {
66082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            mTestList.add(NNTestList.TestName.values()[i].toString());
67082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
68082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
69082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mTestListView = findViewById(R.id.test_list);
70082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mTestListAdapter = new ArrayAdapter(this,
71082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                android.R.layout.simple_list_item_activated_1,
72082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                mTestList);
73082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
74082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mTestListView.setAdapter(mTestListAdapter);
75082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mTestListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
76082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mTestListAdapter.notifyDataSetChanged();
77082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
78082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mResultView = findViewById(R.id.results);
79082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        mResultView.setMovementMethod(new ScrollingMovementMethod());
80082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
81082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
82082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    @Override
83082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    protected void onCreate(Bundle savedInstanceState) {
84082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        super.onCreate(savedInstanceState);
85082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        setContentView(R.layout.controls);
86082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        init();
87082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
88082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
89082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    @Override
90082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    protected void onPause() {
91082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        super.onPause();
92082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
93082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
94082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    @Override
95082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    protected void onResume() {
96082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        super.onResume();
97082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
98082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
99082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    Intent makeBasicLaunchIntent() {
100082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        Intent intent = new Intent(this, NNBenchmark.class);
101082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        intent.putExtra("enable long", mSettings[SETTING_LONG_RUN]);
102082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        intent.putExtra("enable pause", mSettings[SETTING_PAUSE]);
103082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        return intent;
104082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
105082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
106082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public void btnRun(View v) {
107082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        NNTestList.TestName t[] = NNTestList.TestName.values();
108082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        int count = 0;
109082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        for (int i = 0; i < t.length; i++) {
110082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            if (mTestListView.isItemChecked(i)) {
111082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                count++;
112082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            }
113082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
114082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        if (count == 0) {
115082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            return;
116082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
117082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
118082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        int testList[] = new int[count];
119082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        count = 0;
120082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        for (int i = 0; i < t.length; i++) {
121082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            if (mTestListView.isItemChecked(i)) {
122082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                testList[count++] = i;
123082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            }
124082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
125082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
126082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        Intent intent = makeBasicLaunchIntent();
127082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        intent.putExtra("tests", testList);
128082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        startActivityForResult(intent, 0);
129082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
130082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
131082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    float rebase(float v, NNTestList.TestName t) {
132082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        if (v > 0.001) {
133082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            v = t.baseline / v;
134082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
135082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        return v;
136082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
137082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
138082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
139082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    private void writeResults() {
140082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        // write result into a file
141082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        File externalStorage = Environment.getExternalStorageDirectory();
142082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        if (!externalStorage.canWrite()) {
143082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            Log.v(NNBenchmark.TAG, "sdcard is not writable");
144082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            return;
145082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
146082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        File resultFile = new File(externalStorage, RESULT_FILE);
147082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        resultFile.setWritable(true, false);
148082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        try {
149082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
150082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            Log.v(NNBenchmark.TAG, "Saved results in: " + resultFile.getAbsolutePath());
151082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            java.text.DecimalFormat df = new java.text.DecimalFormat("######.##");
152082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
153082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            for (int ct=0; ct < NNTestList.TestName.values().length; ct++) {
154082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                NNTestList.TestName t = NNTestList.TestName.values()[ct];
155082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                final float r = mResults[ct];
156082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                float r2 = rebase(r, t);
157082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                String s = new String("" + t.toString() + ", " + df.format(r) + ", " +
158082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                        df.format(r2));
159082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                rsWriter.write(s + "\n");
160082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            }
161082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            rsWriter.close();
162082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        } catch (IOException e) {
163082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            Log.v(NNBenchmark.TAG, "Unable to write result file " + e.getMessage());
164082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
165082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
166082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
167082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
168082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        if (requestCode == 0) {
169082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            if (resultCode == RESULT_OK) {
170082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                java.text.DecimalFormat df = new java.text.DecimalFormat("######.##");
171082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                mResults = new float[NNTestList.TestName.values().length];
172082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                mInfo = new String[NNTestList.TestName.values().length];
173082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
174082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                float r[] = data.getFloatArrayExtra("results");
175082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                String inf[] = data.getStringArrayExtra("testinfo");
176082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                int id[] = data.getIntArrayExtra("tests");
177082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
178082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                String mOutResult = "";
179082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                for (int ct=0; ct < id.length; ct++) {
180082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    NNTestList.TestName t = NNTestList.TestName.values()[id[ct]];
181082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    String s = t.toString() + "   " + df.format(rebase(r[ct], t)) +
182082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                            "X,   " + df.format(r[ct]) + "ms";
183082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    mTestList.set(id[ct], s);
184082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    mTestListAdapter.notifyDataSetChanged();
185082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    mOutResult += s + '\n';
186082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                    mResults[id[ct]] = r[ct];
187082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                }
188082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
189082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                mResultView.setText(mOutResult);
190082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                writeResults();
191082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            }
192082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
193082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
194082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
195082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public void btnSelAll(View v) {
196082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        NNTestList.TestName t[] = NNTestList.TestName.values();
197082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        for (int i=0; i < t.length; i++) {
198082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            mTestListView.setItemChecked(i, true);
199082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
200082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
201082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
202082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public boolean onOptionsItemSelected(MenuItem item) {
203082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        // Handle presses on the action bar items
204082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        switch(item.getItemId()) {
205082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            case R.id.action_settings:
206082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                NNSettings newFragment = new NNSettings(mSettings);
207082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                newFragment.show(getFragmentManager(), "settings");
208082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                return true;
209082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            default:
210082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang                return super.onOptionsItemSelected(item);
211082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
212082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
213082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
214082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public void btnSelNone(View v) {
215082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        NNTestList.TestName t[] = NNTestList.TestName.values();
216082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        for (int i=0; i < t.length; i++) {
217082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang            mTestListView.setItemChecked(i, false);
218082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        }
219082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
220082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang
221082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    public void btnSettings(View v) {
222082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        NNSettings newFragment = new NNSettings(mSettings);
223082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang        newFragment.show(getFragmentManager(), "settings");
224082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang    }
225082ac6c7e0735b40e2e27f668b294b5f90b2e29bMiao Wang}
226