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