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