blob: 400dff026293b5af364a34887ef1a94a7a03a749 [file] [log] [blame]
Chris Craikc3683b52012-10-01 18:22:38 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.test.hwuicompare;
18
19import com.android.test.hwuicompare.R;
20
21import android.graphics.Bitmap;
22import android.graphics.Color;
23import android.os.Bundle;
24import android.util.Log;
25import android.view.View;
26import android.view.View.OnClickListener;
27import android.widget.AdapterView;
28import android.widget.ArrayAdapter;
29import android.widget.Button;
30import android.widget.ImageButton;
31import android.widget.ImageView;
32import android.widget.LinearLayout;
33import android.widget.Spinner;
34import android.widget.TextView;
35
36public class ManualActivity extends CompareActivity {
37 private static final String LOG_TAG = "ManualActivity";
38 private ImageView mCompareImageView;
39 private Bitmap mCompareBitmap;
40 private TextView mErrorTextView;
41 private MainView mSoftwareView;
42
43 private static final int COMPARE_VIEW_UNINITIALIZED = -1;
44 private static final int COMPARE_VIEW_HARDWARE = 0;
45 private static final int COMPARE_VIEW_SOFTWARE = 1;
46 private static final int COMPARE_VIEW_HEATMAP = 2; // TODO: add more like this? any ideas?
47
48 private int mCompareImageViewState = COMPARE_VIEW_UNINITIALIZED;
49 private int mLastCompareImageViewState = COMPARE_VIEW_UNINITIALIZED;
50
51 Runnable mRunnable = new Runnable() {
52 @Override
53 public void run() {
54 Log.d(LOG_TAG, "mRunnable running, mRedrewFlag = " + mRedrewFlag);
55
56 if (mRedrewFlag) {
57 loadBitmaps();
58 // recalculate error
59 float error = mErrorCalculator.calcErrorRS(mSoftwareBitmap, mHardwareBitmap);
60 String modname = "";
61 for (String s : DisplayModifier.getLastAppliedModifications()) {
62 modname = modname.concat(s + ".");
63 }
64
65 Log.d(LOG_TAG, "error for " + modname + " is " + error);
66 mErrorTextView.setText(String.format("%.4f", error));
67 }
68
69 if (mCompareImageViewState != mLastCompareImageViewState || mRedrewFlag) {
70 switch (mCompareImageViewState) {
71 case COMPARE_VIEW_UNINITIALIZED:
72 // set to hardware
73 case COMPARE_VIEW_HARDWARE:
74 mCompareImageView.setImageBitmap(mHardwareBitmap);
75 break;
76 case COMPARE_VIEW_SOFTWARE:
77 mCompareImageView.setImageBitmap(mSoftwareBitmap);
78 break;
79 case COMPARE_VIEW_HEATMAP:
80 mErrorCalculator.calcErrorHeatmapRS(mSoftwareBitmap, mHardwareBitmap,
81 mCompareBitmap);
82 mCompareImageView.setImageBitmap(mCompareBitmap);
83 break;
84 }
85 mCompareImageView.invalidate();
86 }
87
88 mLastCompareImageViewState = mCompareImageViewState;
89 mRedrewFlag = false;
90 mHandler.removeCallbacks(mRunnable);
91 }
92 };
93
94 private void redrawViews() {
95 mHardwareView.invalidate();
96 mSoftwareView.invalidate();
97 }
98
99 @Override
100 protected void onCreate(Bundle savedInstanceState) {
101 super.onCreate(savedInstanceState);
102 setContentView(R.layout.manual_layout);
103 onCreateCommon(mRunnable);
104
105 mSoftwareView = (MainView) findViewById(R.id.software_view);
106 mSoftwareView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
107 mSoftwareView.setBackgroundColor(Color.WHITE);
108 mSoftwareView.addDrawCallback(mDrawCallback);
109
110 mCompareImageView = (ImageView) findViewById(R.id.compare_image_view);
111
112 int width = getResources().getDimensionPixelSize(R.dimen.layer_width);
113 int height = getResources().getDimensionPixelSize(R.dimen.layer_height);
114 mCompareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
115
116 mErrorTextView = (TextView) findViewById(R.id.current_error);
117 ((ImageButton) findViewById(R.id.next)).setOnClickListener(new OnClickListener() {
118 @Override
119 public void onClick(View v) {
120 DisplayModifier.step();
121 updateSpinners();
122 redrawViews();
123 }
124 });
125 ((ImageButton) findViewById(R.id.previous)).setOnClickListener(new OnClickListener() {
126 @Override
127 public void onClick(View v) {
128 DisplayModifier.stepBack();
129 updateSpinners();
130 redrawViews();
131 }
132 });
133 ((Button) findViewById(R.id.show_hardware_version))
134 .setOnClickListener(new OnClickListener() {
135 @Override
136 public void onClick(View v) {
137 mCompareImageViewState = COMPARE_VIEW_HARDWARE;
138 mHandler.post(mRunnable);
139 }
140 });
141 ((Button) findViewById(R.id.show_software_version))
142 .setOnClickListener(new OnClickListener() {
143 @Override
144 public void onClick(View v) {
145 mCompareImageViewState = COMPARE_VIEW_SOFTWARE;
146 mHandler.post(mRunnable);
147 }
148 });
149 ((Button) findViewById(R.id.show_error_heatmap)).setOnClickListener(new OnClickListener() {
150 @Override
151 public void onClick(View v) {
152 mCompareImageViewState = COMPARE_VIEW_HEATMAP;
153 mHandler.post(mRunnable);
154 }
155 });
156
157 buildSpinnerLayout();
158 }
159
160 private class DisplayModifierSpinner extends Spinner {
161 private final int mIndex;
162
163 public DisplayModifierSpinner(int index) {
164 super(ManualActivity.this);
165 mIndex = index;
166 setOnItemSelectedListener(new OnItemSelectedListener() {
167
168 @Override
169 public void onItemSelected(AdapterView<?> parentView, View selectedItem,
170 int position, long id) {
171 DisplayModifier.setIndex(mIndex, position);
172 redrawViews();
173 }
174
175 @Override
176 public void onNothingSelected(AdapterView<?> parentView) {
177 }
178 });
179 }
180 }
181
182 private Spinner[] mSpinners;
183
184 private void buildSpinnerLayout() {
185 LinearLayout layout = (LinearLayout) findViewById(R.id.spinner_layout);
186 String[][] mapsStrings = DisplayModifier.getStrings();
187 mSpinners = new Spinner[mapsStrings.length];
188 int index = 0;
189 for (String[] spinnerValues : mapsStrings) {
190 mSpinners[index] = new DisplayModifierSpinner(index);
191 mSpinners[index].setAdapter(new ArrayAdapter<String>(this,
192 android.R.layout.simple_spinner_dropdown_item, spinnerValues));
193 layout.addView(mSpinners[index]);
194 index++;
195 }
196 Log.d(LOG_TAG, "created " + index + " spinners");
197 }
198
199 private void updateSpinners() {
200 int[] indices = DisplayModifier.getIndices();
201 for (int i = 0; i < mSpinners.length; i++) {
202 mSpinners[i].setSelection(indices[i]);
203 }
204 }
205
206 @Override
207 protected boolean forceRecreateBitmaps() {
208 // continually recreate bitmaps to avoid modifying bitmaps currently being drawn
209 return true;
210 }
211}