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