/*
 * 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);
            }
        }
    }
}
