1bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams/*
2bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * Copyright (C) 2013 The Android Open Source Project
3bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams *
4bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * you may not use this file except in compliance with the License.
6bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * You may obtain a copy of the License at
7bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams *
8bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams *
10bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * Unless required by applicable law or agreed to in writing, software
11bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * See the License for the specific language governing permissions and
14bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams * limitations under the License.
15bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams */
16bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
17bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samspackage com.android.rs.imagejb;
18bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
19721a5a24e2278f4012109865d62b98190b3185afJason Samsimport android.view.Menu;
20721a5a24e2278f4012109865d62b98190b3185afJason Samsimport android.view.MenuItem;
21721a5a24e2278f4012109865d62b98190b3185afJason Samsimport android.view.MenuInflater;
22721a5a24e2278f4012109865d62b98190b3185afJason Sams
23bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.app.Activity;
24bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.os.Bundle;
25bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.os.Handler;
26d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Samsimport android.graphics.Point;
27bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.SurfaceView;
28bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.AdapterView;
29bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.ArrayAdapter;
30bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.ImageView;
31bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.SeekBar;
32bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.Spinner;
33bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.ToggleButton;
34bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.TextView;
35bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.CompoundButton;
36bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.widget.ListView;
37bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.view.View;
38bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.util.ArrayList;
39bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.util.ListIterator;
40bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.util.Log;
41bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.content.Intent;
42bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
43bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport android.os.Environment;
44bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.io.BufferedWriter;
45bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.io.File;
46bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.io.FileWriter;
47bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samsimport java.io.IOException;
48bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
49bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Samspublic class IPControlsJB extends Activity {
50bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private final String TAG = "Img";
51bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public final String RESULT_FILE = "image_processing_result.csv";
52bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
53bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private Spinner mResSpinner;
54bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private ListView mTestListView;
55d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    private TextView mResultView;
56bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
57bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private ArrayAdapter<String> mTestListAdapter;
58bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private ArrayList<String> mTestList = new ArrayList<String>();
59bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
60721a5a24e2278f4012109865d62b98190b3185afJason Sams    private boolean mSettings[] = {true, true, true, false, false, false};
61721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_USE_IO = 0;
62721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_ANIMATE = 1;
63721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_DISPLAY = 2;
64721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_USE_DVFS = 3;
65721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_LONG_RUN = 4;
66721a5a24e2278f4012109865d62b98190b3185afJason Sams    private static final int SETTING_PAUSE = 5;
67bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
68d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    private float mResults[];
69bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
70bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public enum Resolutions {
71bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        RES_4K(3840, 2160, "4k (3840x2160)"),
72bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        RES_1080P(1920, 1080, "1080p (1920x1080)"),
73bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        RES_720P(1280, 720, "720p (1280x720)"),
74bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        RES_WVGA(800, 480, "WVGA (800x480)");
75bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
76bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private final String name;
77bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public final int width;
78bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public final int height;
79bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
80bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        private Resolutions(int w, int h, String s) {
81bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            width = w;
82bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            height = h;
83bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            name = s;
84bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
85bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
86bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        // return quoted string as displayed test name
87bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        public String toString() {
88bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            return name;
89bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
90bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
917a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams    private Resolutions mRes;
92bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
93721a5a24e2278f4012109865d62b98190b3185afJason Sams    @Override
94721a5a24e2278f4012109865d62b98190b3185afJason Sams    public boolean onCreateOptionsMenu(Menu menu) {
95721a5a24e2278f4012109865d62b98190b3185afJason Sams        // Inflate the menu items for use in the action bar
96721a5a24e2278f4012109865d62b98190b3185afJason Sams        MenuInflater inflater = getMenuInflater();
97721a5a24e2278f4012109865d62b98190b3185afJason Sams        inflater.inflate(R.menu.main_activity_actions, menu);
98721a5a24e2278f4012109865d62b98190b3185afJason Sams
99721a5a24e2278f4012109865d62b98190b3185afJason Sams        MenuItem searchItem = menu.findItem(R.id.action_res);
100721a5a24e2278f4012109865d62b98190b3185afJason Sams        mResSpinner = (Spinner) searchItem.getActionView();
101721a5a24e2278f4012109865d62b98190b3185afJason Sams
102721a5a24e2278f4012109865d62b98190b3185afJason Sams        mResSpinner.setOnItemSelectedListener(mResSpinnerListener);
103721a5a24e2278f4012109865d62b98190b3185afJason Sams        mResSpinner.setAdapter(new ArrayAdapter<Resolutions>(
104721a5a24e2278f4012109865d62b98190b3185afJason Sams            this, R.layout.spinner_layout, Resolutions.values()));
105721a5a24e2278f4012109865d62b98190b3185afJason Sams
106721a5a24e2278f4012109865d62b98190b3185afJason Sams        // Choose one of the image sizes that close to the resolution
107721a5a24e2278f4012109865d62b98190b3185afJason Sams        // of the screen.
108721a5a24e2278f4012109865d62b98190b3185afJason Sams        Point size = new Point();
109721a5a24e2278f4012109865d62b98190b3185afJason Sams        getWindowManager().getDefaultDisplay().getSize(size);
110721a5a24e2278f4012109865d62b98190b3185afJason Sams        int md = (size.x > size.y) ? size.x : size.y;
111721a5a24e2278f4012109865d62b98190b3185afJason Sams        for (int ct=0; ct < Resolutions.values().length; ct++) {
112721a5a24e2278f4012109865d62b98190b3185afJason Sams            if (Resolutions.values()[ct].width <= (int)(md * 1.2)) {
113721a5a24e2278f4012109865d62b98190b3185afJason Sams                mResSpinner.setSelection(ct);
114721a5a24e2278f4012109865d62b98190b3185afJason Sams                break;
115721a5a24e2278f4012109865d62b98190b3185afJason Sams            }
116721a5a24e2278f4012109865d62b98190b3185afJason Sams        }
117721a5a24e2278f4012109865d62b98190b3185afJason Sams
118721a5a24e2278f4012109865d62b98190b3185afJason Sams        return super.onCreateOptionsMenu(menu);
119721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
120721a5a24e2278f4012109865d62b98190b3185afJason Sams
121bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
122bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private AdapterView.OnItemSelectedListener mResSpinnerListener =
123bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            new AdapterView.OnItemSelectedListener() {
124bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
1257a3e3aa4948ff4b2c19a62f0b5003b902db0ce24Jason Sams                    mRes = Resolutions.values()[pos];
126bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
127bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
128bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                public void onNothingSelected(AdapterView parent) {
129bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
130bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            };
131bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
132721a5a24e2278f4012109865d62b98190b3185afJason Sams    void launchDemo(int id) {
133721a5a24e2278f4012109865d62b98190b3185afJason Sams        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
134bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
135721a5a24e2278f4012109865d62b98190b3185afJason Sams        int testList[] = new int[1];
136721a5a24e2278f4012109865d62b98190b3185afJason Sams        testList[0] = id;
137721a5a24e2278f4012109865d62b98190b3185afJason Sams
138721a5a24e2278f4012109865d62b98190b3185afJason Sams        Intent intent = makeBasicLaunchIntent();
139721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("tests", testList);
140721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("demo", true);
141721a5a24e2278f4012109865d62b98190b3185afJason Sams        startActivityForResult(intent, 0);
142721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
143721a5a24e2278f4012109865d62b98190b3185afJason Sams
144721a5a24e2278f4012109865d62b98190b3185afJason Sams    void init() {
145bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
146bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        for (int i=0; i < IPTestListJB.TestName.values().length; i++) {
147bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mTestList.add(IPTestListJB.TestName.values()[i].toString());
148bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
149bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
1508467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mTestListView = findViewById(R.id.test_list);
151bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestListAdapter = new ArrayAdapter(this,
152bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                android.R.layout.simple_list_item_activated_1,
153bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                mTestList);
154bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
155bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestListView.setAdapter(mTestListAdapter);
156bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
157bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        mTestListAdapter.notifyDataSetChanged();
158bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
1598467325c6d80de30bb86b7665cc41dff0c276e8dAlan Viverette        mResultView = findViewById(R.id.results);
160bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
161721a5a24e2278f4012109865d62b98190b3185afJason Sams        mTestListView.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
162721a5a24e2278f4012109865d62b98190b3185afJason Sams                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
163721a5a24e2278f4012109865d62b98190b3185afJason Sams                        int pos, long id) {
164721a5a24e2278f4012109865d62b98190b3185afJason Sams                    launchDemo(pos);
165721a5a24e2278f4012109865d62b98190b3185afJason Sams                    return true;
166721a5a24e2278f4012109865d62b98190b3185afJason Sams                }
167721a5a24e2278f4012109865d62b98190b3185afJason Sams            });
168bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
169bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
170bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
171bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onCreate(Bundle savedInstanceState) {
172bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onCreate(savedInstanceState);
173bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        setContentView(R.layout.controls);
174bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        init();
175bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
176bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
177bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
178bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onPause() {
179bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onPause();
180bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
181bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        //cleanup();
182bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
183bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
184bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
185bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    @Override
186bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onResume() {
187bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        super.onResume();
188bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
189bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams       // init();
190bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
191bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
192bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    private void checkGroup(int group) {
193bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
194bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        for (int i=0; i < t.length; i++) {
195bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mTestListView.setItemChecked(i, group == t[i].group);
196bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
197bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
198bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
199721a5a24e2278f4012109865d62b98190b3185afJason Sams    Intent makeBasicLaunchIntent() {
200721a5a24e2278f4012109865d62b98190b3185afJason Sams        Intent intent = new Intent(this, ImageProcessingActivityJB.class);
201721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable io", mSettings[SETTING_USE_IO]);
202721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable dvfs", mSettings[SETTING_USE_DVFS]);
203721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable long", mSettings[SETTING_LONG_RUN]);
204721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable pause", mSettings[SETTING_PAUSE]);
205721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable animate", mSettings[SETTING_ANIMATE]);
206721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("enable display", mSettings[SETTING_DISPLAY]);
207721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("resolution X", mRes.width);
208721a5a24e2278f4012109865d62b98190b3185afJason Sams        intent.putExtra("resolution Y", mRes.height);
209721a5a24e2278f4012109865d62b98190b3185afJason Sams        return intent;
210721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
211721a5a24e2278f4012109865d62b98190b3185afJason Sams
212bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnRun(View v) {
213bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
214bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
215bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        int count = 0;
216bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        for (int i = 0; i < t.length; i++) {
217bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            if (mTestListView.isItemChecked(i)) {
218bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                count++;
219bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
220bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
221bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        if (count == 0) {
222bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            return;
223bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
224bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
225bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        int testList[] = new int[count];
226bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        count = 0;
227bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        for (int i = 0; i < t.length; i++) {
228bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            if (mTestListView.isItemChecked(i)) {
229bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                testList[count++] = i;
230bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
231bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
232bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
233721a5a24e2278f4012109865d62b98190b3185afJason Sams        Intent intent = makeBasicLaunchIntent();
234bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        intent.putExtra("tests", testList);
235bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        startActivityForResult(intent, 0);
236bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
237bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
238d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    float rebase(float v, IPTestListJB.TestName t) {
239d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        if (v > 0.001) {
240d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            v = t.baseline / v;
241d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        }
242d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        float pr = (1920.f / mRes.width) * (1080.f / mRes.height);
243d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        return v / pr;
244d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    }
245d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams
246d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    private void writeResults() {
247d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        // write result into a file
248d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        File externalStorage = Environment.getExternalStorageDirectory();
249d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        if (!externalStorage.canWrite()) {
250d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            Log.v(TAG, "sdcard is not writable");
251d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            return;
252d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        }
253d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        File resultFile = new File(externalStorage, RESULT_FILE);
254d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        resultFile.setWritable(true, false);
255d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        try {
256d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
257d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
258d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            java.text.DecimalFormat df = new java.text.DecimalFormat("######.##");
259d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams
260d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            for (int ct=0; ct < IPTestListJB.TestName.values().length; ct++) {
261d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                IPTestListJB.TestName t = IPTestListJB.TestName.values()[ct];
262d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                final float r = mResults[ct];
263d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                float r2 = rebase(r, t);
264d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                String s = new String("" + t.toString() + ", " + df.format(r) + ", " + df.format(r2));
265d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                rsWriter.write(s + "\n");
266d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            }
267d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            rsWriter.close();
268d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        } catch (IOException e) {
269d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams            Log.v(TAG, "Unable to write result file " + e.getMessage());
270d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams        }
271d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams    }
272d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams
273bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
274bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        if (requestCode == 0) {
275bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            if (resultCode == RESULT_OK) {
276d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                java.text.DecimalFormat df = new java.text.DecimalFormat("######.#");
277d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                mResults = new float[IPTestListJB.TestName.values().length];
278d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams
279bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                float r[] = data.getFloatArrayExtra("results");
280bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                int id[] = data.getIntArrayExtra("tests");
281bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
282bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                for (int ct=0; ct < id.length; ct++) {
283bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    IPTestListJB.TestName t = IPTestListJB.TestName.values()[id[ct]];
284bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
285d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                    String s = t.toString() + "   " + df.format(rebase(r[ct], t)) +
286d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                            "X,   " + df.format(r[ct]) + "ms";
287bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mTestList.set(id[ct], s);
288bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                    mTestListAdapter.notifyDataSetChanged();
289d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                    mResults[id[ct]] = r[ct];
290bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams                }
291bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
292d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                double gm[] = {1.0, 1.0, 1.0};
293d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                double count[] = {0, 0, 0};
294d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                for (int ct=0; ct < IPTestListJB.TestName.values().length; ct++) {
295d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                    IPTestListJB.TestName t = IPTestListJB.TestName.values()[ct];
296d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                    gm[t.group] *= rebase(mResults[ct], t);
297d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                    count[t.group] += 1.0;
298d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                }
299d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                gm[0] = java.lang.Math.pow(gm[0], 1.0 / count[0]);
300d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                gm[1] = java.lang.Math.pow(gm[1], 1.0 / count[1]);
301d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                gm[2] = java.lang.Math.pow(gm[2], 1.0 / count[2]);
302d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams
303d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                String s = "Results:  fp full=" + df.format(gm[0]) +
304d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                        ",  fp relaxed=" +df.format(gm[1]) +
305d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                        ",  intrinsics=" + df.format(gm[2]);
306d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                mResultView.setText(s);
307d3caba7c611de6f90bf7914ab00d425ff0ff0067Jason Sams                writeResults();
308bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            }
309bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
310bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
311bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
312bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnSelAll(View v) {
313bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
314bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        for (int i=0; i < t.length; i++) {
315bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams            mTestListView.setItemChecked(i, true);
316bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        }
317bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
318bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
319721a5a24e2278f4012109865d62b98190b3185afJason Sams    public boolean onOptionsItemSelected(MenuItem item) {
320721a5a24e2278f4012109865d62b98190b3185afJason Sams        // Handle presses on the action bar items
321721a5a24e2278f4012109865d62b98190b3185afJason Sams        switch(item.getItemId()) {
322721a5a24e2278f4012109865d62b98190b3185afJason Sams            case R.id.action_settings:
323721a5a24e2278f4012109865d62b98190b3185afJason Sams                IPSettings newFragment = new IPSettings(mSettings);
324721a5a24e2278f4012109865d62b98190b3185afJason Sams                newFragment.show(getFragmentManager(), "settings");
325721a5a24e2278f4012109865d62b98190b3185afJason Sams                return true;
326721a5a24e2278f4012109865d62b98190b3185afJason Sams            default:
327721a5a24e2278f4012109865d62b98190b3185afJason Sams                return super.onOptionsItemSelected(item);
328721a5a24e2278f4012109865d62b98190b3185afJason Sams        }
329721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
330721a5a24e2278f4012109865d62b98190b3185afJason Sams
331bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnSelNone(View v) {
332bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        checkGroup(-1);
333bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
334bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
335bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnSelHp(View v) {
336bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        checkGroup(0);
337bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
338bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
339bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnSelLp(View v) {
340bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        checkGroup(1);
341bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
342bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
343721a5a24e2278f4012109865d62b98190b3185afJason Sams    public void btnSettings(View v) {
344721a5a24e2278f4012109865d62b98190b3185afJason Sams        IPSettings newFragment = new IPSettings(mSettings);
345721a5a24e2278f4012109865d62b98190b3185afJason Sams        newFragment.show(getFragmentManager(), "settings");
346721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
347721a5a24e2278f4012109865d62b98190b3185afJason Sams
348bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    public void btnSelIntrinsic(View v) {
349bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams        checkGroup(2);
350bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams    }
351bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
352bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
353bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams
354bde1a28e6652f25e4f74f018cb7d1dcba65a51e4Jason Sams}
355