1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.wearable.watchface;
18 
19 import android.graphics.Canvas;
20 import android.graphics.Color;
21 import android.graphics.Paint;
22 import android.graphics.Rect;
23 import android.support.wearable.watchface.CanvasWatchFaceService;
24 import android.support.wearable.watchface.WatchFaceStyle;
25 import android.util.Log;
26 import android.view.SurfaceHolder;
27 
28 /**
29  * Proof of concept sample watch face that demonstrates how a watch face can detect where the peek
30  * card is. This watch face draws a border around the area where the peeking card is.
31  */
32 public class CardBoundsWatchFaceService extends CanvasWatchFaceService {
33 
34     private static final String TAG = "CardBoundsWatchFace";
35 
36     @Override
onCreateEngine()37     public Engine onCreateEngine() {
38         return new Engine();
39     }
40 
41     private class Engine extends CanvasWatchFaceService.Engine {
42 
43         static final int BORDER_WIDTH_PX = 5;
44 
45         final Rect mCardBounds = new Rect();
46         final Paint mPaint = new Paint();
47 
48         @Override
onCreate(SurfaceHolder holder)49         public void onCreate(SurfaceHolder holder) {
50             if (Log.isLoggable(TAG, Log.DEBUG)) {
51                 Log.d(TAG, "onCreate");
52             }
53             super.onCreate(holder);
54             setWatchFaceStyle(new WatchFaceStyle.Builder(CardBoundsWatchFaceService.this)
55                     .setCardPeekMode(WatchFaceStyle.PEEK_MODE_VARIABLE)
56                     .setBackgroundVisibility(WatchFaceStyle.BACKGROUND_VISIBILITY_INTERRUPTIVE)
57                     .setShowSystemUiTime(true)
58                     .setPeekOpacityMode(WatchFaceStyle.PEEK_OPACITY_MODE_TRANSLUCENT)
59                     .build());
60         }
61 
62         @Override
onAmbientModeChanged(boolean inAmbientMode)63         public void onAmbientModeChanged(boolean inAmbientMode) {
64             if (Log.isLoggable(TAG, Log.DEBUG)) {
65                 Log.d(TAG, "onAmbientModeChanged: " + inAmbientMode);
66             }
67             super.onAmbientModeChanged(inAmbientMode);
68             invalidate();
69         }
70 
71         @Override
onPeekCardPositionUpdate(Rect bounds)72         public void onPeekCardPositionUpdate(Rect bounds) {
73             super.onPeekCardPositionUpdate(bounds);
74             if (Log.isLoggable(TAG, Log.DEBUG)) {
75                 Log.d(TAG, "onPeekCardPositionUpdate: " + bounds);
76             }
77             super.onPeekCardPositionUpdate(bounds);
78             if (!bounds.equals(mCardBounds)) {
79                 mCardBounds.set(bounds);
80                 invalidate();
81             }
82         }
83 
84         @Override
onDraw(Canvas canvas, Rect bounds)85         public void onDraw(Canvas canvas, Rect bounds) {
86             // Clear screen.
87             canvas.drawColor(isInAmbientMode() ? Color.BLACK : Color.BLUE);
88 
89             // Draw border around card in interactive mode.
90             if (!isInAmbientMode()) {
91                 mPaint.setColor(Color.MAGENTA);
92                 canvas.drawRect(mCardBounds.left - BORDER_WIDTH_PX,
93                         mCardBounds.top - BORDER_WIDTH_PX,
94                         mCardBounds.right + BORDER_WIDTH_PX,
95                         mCardBounds.bottom + BORDER_WIDTH_PX, mPaint);
96             }
97 
98             // Fill area under card.
99             mPaint.setColor(isInAmbientMode() ? Color.RED : Color.GREEN);
100             canvas.drawRect(mCardBounds, mPaint);
101         }
102     }
103 }
104