1/* 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} 212