Home | History | Annotate | Download | only in hwuicompare
      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 
     17 package com.android.test.hwuicompare;
     18 
     19 import com.android.test.hwuicompare.R;
     20 
     21 import android.graphics.Bitmap;
     22 import android.graphics.Color;
     23 import android.os.Bundle;
     24 import android.util.Log;
     25 import android.view.View;
     26 import android.view.View.OnClickListener;
     27 import android.widget.AdapterView;
     28 import android.widget.ArrayAdapter;
     29 import android.widget.Button;
     30 import android.widget.ImageButton;
     31 import android.widget.ImageView;
     32 import android.widget.LinearLayout;
     33 import android.widget.Spinner;
     34 import android.widget.TextView;
     35 
     36 public 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