1067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn/*
2067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * Copyright (C) 2014 The Android Open Source Project
3067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn *
4067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * you may not use this file except in compliance with the License.
6067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * You may obtain a copy of the License at
7067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn *
8067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn *
10067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * See the License for the specific language governing permissions and
14067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn * limitations under the License.
15067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn */
16067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
17067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornpackage com.example.wallpapertest;
18067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
19067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.service.wallpaper.WallpaperService;
20067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.graphics.Canvas;
21067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.graphics.Rect;
22067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.graphics.Paint;
23067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.graphics.Color;
24067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.graphics.RectF;
25067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.text.TextPaint;
26067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.view.SurfaceHolder;
27067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.content.res.XmlResourceParser;
28067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
29067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.os.Handler;
30067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.util.Log;
31067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
32067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornimport android.view.WindowInsets;
33067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
34067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackbornpublic class TestWallpaper extends WallpaperService {
35067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    private static final String LOG_TAG = "PolarClock";
36067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
37067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    private final Handler mHandler = new Handler();
38067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
39067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    @Override
40067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    public void onCreate() {
41067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        super.onCreate();
42067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    }
43067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
44067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    @Override
45067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    public void onDestroy() {
46067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        super.onDestroy();
47067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    }
48067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
49067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    public Engine onCreateEngine() {
50067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        return new ClockEngine();
51067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    }
52067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
53067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    class ClockEngine extends Engine {
54067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private static final int OUTER_COLOR = 0xffff0000;
55067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private static final int INNER_COLOR = 0xff000080;
56067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private static final int STABLE_COLOR = 0xa000ff00;
57067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private static final int TEXT_COLOR = 0xa0ffffff;
58067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
59067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Paint.FontMetrics mTextMetrics = new Paint.FontMetrics();
60067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
61067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private int mPadding;
62067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
63067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Rect mMainInsets = new Rect();
64067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Rect mStableInsets = new Rect();
65067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private boolean mRound = false;
66067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
67067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private int mDesiredWidth;
68067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private int mDesiredHeight;
69067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
70067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private float mOffsetX;
71067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private float mOffsetY;
72067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private float mOffsetXStep;
73067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private float mOffsetYStep;
74067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private int mOffsetXPixels;
75067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private int mOffsetYPixels;
76067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
77067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Paint mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
78067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
79067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
80067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
81067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private final Runnable mDrawClock = new Runnable() {
82067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            public void run() {
83067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                drawFrame();
84067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
85067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        };
86067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        private boolean mVisible;
87067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
88067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        ClockEngine() {
89067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
90067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
91067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
92067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onCreate(SurfaceHolder surfaceHolder) {
93067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onCreate(surfaceHolder);
94067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
95067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mDesiredWidth = getDesiredMinimumWidth();
96067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mDesiredHeight = getDesiredMinimumHeight();
97067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
98067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            Paint paint = mFillPaint;
99067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            paint.setStyle(Paint.Style.FILL);
100067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
101067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            paint = mStrokePaint;
102067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            paint.setStrokeWidth(3);
103067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            paint.setStrokeCap(Paint.Cap.ROUND);
104067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            paint.setStyle(Paint.Style.STROKE);
105067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
106067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            TextPaint tpaint = mTextPaint;
107067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            tpaint.density = getResources().getDisplayMetrics().density;
108067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            tpaint.setCompatibilityScaling(getResources().getCompatibilityInfo().applicationScale);
109067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            tpaint.setColor(TEXT_COLOR);
110067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            tpaint.setTextSize(18 * getResources().getDisplayMetrics().scaledDensity);
111067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            tpaint.setShadowLayer(4 * getResources().getDisplayMetrics().density, 0, 0, 0xff000000);
112067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
113067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mTextPaint.getFontMetrics(mTextMetrics);
114067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
115067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mPadding = (int)(16 * getResources().getDisplayMetrics().density);
116067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
117067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            if (isPreview()) {
118067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                mOffsetX = 0.5f;
119067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                mOffsetY = 0.5f;
120067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
121067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
122067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
123067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
124067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onDestroy() {
125067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onDestroy();
126067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mHandler.removeCallbacks(mDrawClock);
127067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
128067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
129067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
130067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onVisibilityChanged(boolean visible) {
131067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mVisible = visible;
132067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            if (!visible) {
133067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                mHandler.removeCallbacks(mDrawClock);
134067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
135067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            drawFrame();
136067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
137067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
138067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
139067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
140067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onSurfaceChanged(holder, format, width, height);
141067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            drawFrame();
142067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
143067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
144067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
145067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onSurfaceCreated(SurfaceHolder holder) {
146067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onSurfaceCreated(holder);
147067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
148067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
149067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
150067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onSurfaceDestroyed(SurfaceHolder holder) {
151067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onSurfaceDestroyed(holder);
152067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mVisible = false;
153067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mHandler.removeCallbacks(mDrawClock);
154067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
155067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
156067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
157067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onApplyWindowInsets(WindowInsets insets) {
158067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onApplyWindowInsets(insets);
159067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mMainInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(),
160067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
161067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mStableInsets.set(insets.getStableInsetLeft(), insets.getStableInsetTop(),
162067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    insets.getStableInsetRight(), insets.getStableInsetBottom());
163067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mRound = insets.isRound();
164067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            drawFrame();
165067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
166067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
167067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
168067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) {
169067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onDesiredSizeChanged(desiredWidth, desiredHeight);
170067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mDesiredWidth = desiredWidth;
171067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mDesiredHeight = desiredHeight;
172067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            drawFrame();
173067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
174067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
175067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        @Override
176067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        public void onOffsetsChanged(float xOffset, float yOffset,
177067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                float xStep, float yStep, int xPixels, int yPixels) {
178067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels);
179067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
180067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            if (isPreview()) return;
181067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
182067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetX = xOffset;
183067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetY = yOffset;
184067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetXStep = xStep;
185067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetYStep = yStep;
186067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetXPixels = xPixels;
187067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            mOffsetYPixels = yPixels;
188067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
189067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            drawFrame();
190067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
191067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
192067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        void drawFrame() {
193067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            final SurfaceHolder holder = getSurfaceHolder();
194067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            final Rect frame = holder.getSurfaceFrame();
195067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            final int width = frame.width();
196067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            final int height = frame.height();
197067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
198067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            Canvas c = null;
199067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            try {
200067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                c = holder.lockCanvas();
201067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                if (c != null) {
202067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    final Paint paint = mFillPaint;
203067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
204067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    paint.setColor(OUTER_COLOR);
205067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawRect(0, 0, width, height, paint);
206067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
207067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    paint.setColor(INNER_COLOR);
208067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawRect(0+mMainInsets.left, 0+mMainInsets.top,
209067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            width-mMainInsets.right, height-mMainInsets.bottom, paint);
210067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
211067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    mStrokePaint.setColor(STABLE_COLOR);
212067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawRect(0 + mStableInsets.left, 0 + mStableInsets.top,
213067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            width - mStableInsets.right, height - mStableInsets.bottom,
214067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            mStrokePaint);
215067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
216067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    final int ascdesc = (int)(-mTextMetrics.ascent + mTextMetrics.descent);
217067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    final int linegap = (int)(-mTextMetrics.ascent + mTextMetrics.descent
218067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            + mTextMetrics.leading);
219067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
220067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    int x = mStableInsets.left + mPadding;
221067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    int y = height - mStableInsets.bottom - mPadding - ascdesc;
222067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Surface Size: " + width + " x " + height,
223067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
224067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
225067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Desired Size: " + mDesiredWidth + " x " + mDesiredHeight,
226067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
227067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
228067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Cur Offset Raw: " + mOffsetX + ", " + mOffsetY,
229067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
230067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
231067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Cur Offset Step: " + mOffsetXStep + ", " + mOffsetYStep,
232067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
233067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
234067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Cur Offset Pixels: " + mOffsetXPixels + ", " + mOffsetYPixels,
235067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
236067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
237067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("Stable Insets: (" + mStableInsets.left + ", " + mStableInsets.top
238067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            + ") - (" + mStableInsets.right + ", " + mStableInsets.bottom + ")",
239067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
240067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    y -= linegap;
241067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                    c.drawText("System Insets: (" + mMainInsets.left + ", " + mMainInsets.top
242067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            + ") - (" + mMainInsets.right + ", " + mMainInsets.bottom + ")",
243067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                            x, y, mTextPaint);
244067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn
245067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                }
246067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            } finally {
247067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn                if (c != null) holder.unlockCanvasAndPost(c);
248067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn            }
249067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn        }
250067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn    }
251067e5f68b9216b233df1c6529db182ff9b2887abDianne Hackborn}
252