/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.wallpapertest; import android.service.wallpaper.WallpaperService; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.Paint; import android.graphics.Color; import android.graphics.RectF; import android.text.TextPaint; import android.view.SurfaceHolder; import android.content.res.XmlResourceParser; import android.os.Handler; import android.util.Log; import android.view.WindowInsets; public class TestWallpaper extends WallpaperService { private static final String LOG_TAG = "PolarClock"; private final Handler mHandler = new Handler(); @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } public Engine onCreateEngine() { return new ClockEngine(); } class ClockEngine extends Engine { private static final int OUTER_COLOR = 0xffff0000; private static final int INNER_COLOR = 0xff000080; private static final int STABLE_COLOR = 0xa000ff00; private static final int TEXT_COLOR = 0xa0ffffff; private final Paint.FontMetrics mTextMetrics = new Paint.FontMetrics(); private int mPadding; private final Rect mMainInsets = new Rect(); private final Rect mStableInsets = new Rect(); private boolean mRound = false; private int mDesiredWidth; private int mDesiredHeight; private float mOffsetX; private float mOffsetY; private float mOffsetXStep; private float mOffsetYStep; private int mOffsetXPixels; private int mOffsetYPixels; private final Paint mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); private final Runnable mDrawClock = new Runnable() { public void run() { drawFrame(); } }; private boolean mVisible; ClockEngine() { } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); mDesiredWidth = getDesiredMinimumWidth(); mDesiredHeight = getDesiredMinimumHeight(); Paint paint = mFillPaint; paint.setStyle(Paint.Style.FILL); paint = mStrokePaint; paint.setStrokeWidth(3); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStyle(Paint.Style.STROKE); TextPaint tpaint = mTextPaint; tpaint.density = getResources().getDisplayMetrics().density; tpaint.setCompatibilityScaling(getResources().getCompatibilityInfo().applicationScale); tpaint.setColor(TEXT_COLOR); tpaint.setTextSize(18 * getResources().getDisplayMetrics().scaledDensity); tpaint.setShadowLayer(4 * getResources().getDisplayMetrics().density, 0, 0, 0xff000000); mTextPaint.getFontMetrics(mTextMetrics); mPadding = (int)(16 * getResources().getDisplayMetrics().density); if (isPreview()) { mOffsetX = 0.5f; mOffsetY = 0.5f; } } @Override public void onDestroy() { super.onDestroy(); mHandler.removeCallbacks(mDrawClock); } @Override public void onVisibilityChanged(boolean visible) { mVisible = visible; if (!visible) { mHandler.removeCallbacks(mDrawClock); } drawFrame(); } @Override public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { super.onSurfaceChanged(holder, format, width, height); drawFrame(); } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); mVisible = false; mHandler.removeCallbacks(mDrawClock); } @Override public void onApplyWindowInsets(WindowInsets insets) { super.onApplyWindowInsets(insets); mMainInsets.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); mStableInsets.set(insets.getStableInsetLeft(), insets.getStableInsetTop(), insets.getStableInsetRight(), insets.getStableInsetBottom()); mRound = insets.isRound(); drawFrame(); } @Override public void onDesiredSizeChanged(int desiredWidth, int desiredHeight) { super.onDesiredSizeChanged(desiredWidth, desiredHeight); mDesiredWidth = desiredWidth; mDesiredHeight = desiredHeight; drawFrame(); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels); if (isPreview()) return; mOffsetX = xOffset; mOffsetY = yOffset; mOffsetXStep = xStep; mOffsetYStep = yStep; mOffsetXPixels = xPixels; mOffsetYPixels = yPixels; drawFrame(); } void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); final Rect frame = holder.getSurfaceFrame(); final int width = frame.width(); final int height = frame.height(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { final Paint paint = mFillPaint; paint.setColor(OUTER_COLOR); c.drawRect(0, 0, width, height, paint); paint.setColor(INNER_COLOR); c.drawRect(0+mMainInsets.left, 0+mMainInsets.top, width-mMainInsets.right, height-mMainInsets.bottom, paint); mStrokePaint.setColor(STABLE_COLOR); c.drawRect(0 + mStableInsets.left, 0 + mStableInsets.top, width - mStableInsets.right, height - mStableInsets.bottom, mStrokePaint); final int ascdesc = (int)(-mTextMetrics.ascent + mTextMetrics.descent); final int linegap = (int)(-mTextMetrics.ascent + mTextMetrics.descent + mTextMetrics.leading); int x = mStableInsets.left + mPadding; int y = height - mStableInsets.bottom - mPadding - ascdesc; c.drawText("Surface Size: " + width + " x " + height, x, y, mTextPaint); y -= linegap; c.drawText("Desired Size: " + mDesiredWidth + " x " + mDesiredHeight, x, y, mTextPaint); y -= linegap; c.drawText("Cur Offset Raw: " + mOffsetX + ", " + mOffsetY, x, y, mTextPaint); y -= linegap; c.drawText("Cur Offset Step: " + mOffsetXStep + ", " + mOffsetYStep, x, y, mTextPaint); y -= linegap; c.drawText("Cur Offset Pixels: " + mOffsetXPixels + ", " + mOffsetYPixels, x, y, mTextPaint); y -= linegap; c.drawText("Stable Insets: (" + mStableInsets.left + ", " + mStableInsets.top + ") - (" + mStableInsets.right + ", " + mStableInsets.bottom + ")", x, y, mTextPaint); y -= linegap; c.drawText("System Insets: (" + mMainInsets.left + ", " + mMainInsets.top + ") - (" + mMainInsets.right + ", " + mMainInsets.bottom + ")", x, y, mTextPaint); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } } } }