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