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 java.lang.reflect.InvocationTargetException;
20c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport java.lang.reflect.Method;
21c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
22c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport com.android.test.hwuicompare.R;
23c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
24c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.app.Activity;
25c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.Bitmap;
26c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.Canvas;
27c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.Color;
28c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.drawable.ColorDrawable;
29c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.os.Handler;
30c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.os.Trace;
31c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.util.Log;
32c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.view.View;
33c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
34c3683b552f592d8039a466c663f7de8c8286e975Chris Craikabstract public class CompareActivity extends Activity {
35c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final String LOG_TAG = "CompareActivity";
36c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
37c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected MainView mHardwareView = null;
38c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
39c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected Bitmap mSoftwareBitmap;
40c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected Bitmap mHardwareBitmap;
41c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
42c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected ErrorCalculator mErrorCalculator;
43c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
44c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected Handler mHandler;
45c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
46c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    Runnable mDrawCallback = null;
47c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected boolean mRedrewFlag = true;
48c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
49c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected void onCreateCommon(final Runnable postDrawCallback) {
50c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mDrawCallback = new Runnable() {
51c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            @Override
52c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            public void run() {
53c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                mRedrewFlag = true;
54c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                mHandler.post(postDrawCallback);
55c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            };
56c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        };
57c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        getWindow().setBackgroundDrawable(new ColorDrawable(0xffefefef));
58c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        ResourceModifiers.init(getResources());
59c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
60c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareView = (MainView) findViewById(R.id.hardware_view);
61c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
62c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareView.setBackgroundColor(Color.WHITE);
63c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareView.addDrawCallback(mDrawCallback);
64c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
65c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int width = getResources().getDimensionPixelSize(R.dimen.layer_width);
66c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int height = getResources().getDimensionPixelSize(R.dimen.layer_height);
67c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mSoftwareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
68c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
69c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
70c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mErrorCalculator = new ErrorCalculator(getApplicationContext(), getResources());
71c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
72c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHandler = new Handler();
73c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
74c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
75c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected abstract boolean forceRecreateBitmaps();
76c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
77c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected void loadBitmaps() {
78c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        Trace.traceBegin(Trace.TRACE_TAG_ALWAYS, "loadBitmaps");
79c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        if (forceRecreateBitmaps()) {
80c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            int width = mSoftwareBitmap.getWidth();
81c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            int height = mSoftwareBitmap.getHeight();
82c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
83c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mSoftwareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
84c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mHardwareBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
85c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
86c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
87c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        Trace.traceBegin(Trace.TRACE_TAG_ALWAYS, "softwareDraw");
88c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mHardwareView.draw(new Canvas(mSoftwareBitmap));
89c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
90c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
91c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        try {
92c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            Method getHardwareLayer = View.class.getDeclaredMethod("getHardwareLayer");
93c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (!getHardwareLayer.isAccessible())
94c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                getHardwareLayer.setAccessible(true);
95c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            Object hardwareLayer = getHardwareLayer.invoke(mHardwareView);
96c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (hardwareLayer == null) {
97c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                Log.d(LOG_TAG, "failure to access hardware layer");
98c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                return;
99c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
10004fc583c3dd3144bc6b718fcac4b3e1afdfdb067John Reck            Method copyInto = hardwareLayer.getClass()
101c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    .getDeclaredMethod("copyInto", Bitmap.class);
102c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (!copyInto.isAccessible())
103c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                copyInto.setAccessible(true);
104c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
105c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            Trace.traceBegin(Trace.TRACE_TAG_ALWAYS, "copyInto");
106c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            boolean success = (Boolean) copyInto.invoke(hardwareLayer, mHardwareBitmap);
107c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
108c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (!success) {
109c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                Log.d(LOG_TAG, "failure to copy hardware layer into bitmap");
110c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
111c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } catch (NoSuchMethodException e) {
112c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            e.printStackTrace();
113c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } catch (IllegalArgumentException e) {
114c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            e.printStackTrace();
115c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } catch (IllegalAccessException e) {
116c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            e.printStackTrace();
117c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } catch (InvocationTargetException e) {
118c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            e.printStackTrace();
119c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
120c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        Trace.traceEnd(Trace.TRACE_TAG_ALWAYS);
121c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
122c3683b552f592d8039a466c663f7de8c8286e975Chris Craik}
123