/* * 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.android.wearable.watchface; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.support.wearable.watchface.CanvasWatchFaceService; import android.support.wearable.watchface.WatchFaceStyle; import android.util.Log; import android.view.SurfaceHolder; /** * Proof of concept sample watch face that demonstrates how a watch face can detect where the peek * card is. This watch face draws a border around the area where the peeking card is. */ public class CardBoundsWatchFaceService extends CanvasWatchFaceService { private static final String TAG = "CardBoundsWatchFace"; @Override public Engine onCreateEngine() { return new Engine(); } private class Engine extends CanvasWatchFaceService.Engine { static final int BORDER_WIDTH_PX = 5; final Rect mCardBounds = new Rect(); final Paint mPaint = new Paint(); @Override public void onCreate(SurfaceHolder holder) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onCreate"); } super.onCreate(holder); setWatchFaceStyle(new WatchFaceStyle.Builder(CardBoundsWatchFaceService.this) .setCardPeekMode(WatchFaceStyle.PEEK_MODE_VARIABLE) .setBackgroundVisibility(WatchFaceStyle.BACKGROUND_VISIBILITY_INTERRUPTIVE) .setShowSystemUiTime(true) .setPeekOpacityMode(WatchFaceStyle.PEEK_OPACITY_MODE_TRANSLUCENT) .build()); } @Override public void onAmbientModeChanged(boolean inAmbientMode) { if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onAmbientModeChanged: " + inAmbientMode); } super.onAmbientModeChanged(inAmbientMode); invalidate(); } @Override public void onPeekCardPositionUpdate(Rect bounds) { super.onPeekCardPositionUpdate(bounds); if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "onPeekCardPositionUpdate: " + bounds); } super.onPeekCardPositionUpdate(bounds); if (!bounds.equals(mCardBounds)) { mCardBounds.set(bounds); invalidate(); } } @Override public void onDraw(Canvas canvas, Rect bounds) { // Clear screen. canvas.drawColor(isInAmbientMode() ? Color.BLACK : Color.BLUE); // Draw border around card in interactive mode. if (!isInAmbientMode()) { mPaint.setColor(Color.MAGENTA); canvas.drawRect(mCardBounds.left - BORDER_WIDTH_PX, mCardBounds.top - BORDER_WIDTH_PX, mCardBounds.right + BORDER_WIDTH_PX, mCardBounds.bottom + BORDER_WIDTH_PX, mPaint); } // Fill area under card. mPaint.setColor(isInAmbientMode() ? Color.RED : Color.GREEN); canvas.drawRect(mCardBounds, mPaint); } } }