1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.wearable.flashlight;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.animation.ArgbEvaluator;
20*90c8c64dSAndroid Build Coastguard Worker import android.content.Context;
21*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Canvas;
22*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Color;
23*90c8c64dSAndroid Build Coastguard Worker import android.os.Handler;
24*90c8c64dSAndroid Build Coastguard Worker import android.os.Message;
25*90c8c64dSAndroid Build Coastguard Worker import android.util.AttributeSet;
26*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
27*90c8c64dSAndroid Build Coastguard Worker 
28*90c8c64dSAndroid Build Coastguard Worker /**
29*90c8c64dSAndroid Build Coastguard Worker  * Flashing party lights!
30*90c8c64dSAndroid Build Coastguard Worker  */
31*90c8c64dSAndroid Build Coastguard Worker public class PartyLightView extends View {
32*90c8c64dSAndroid Build Coastguard Worker 
33*90c8c64dSAndroid Build Coastguard Worker     private int[] mColors = new int[] {
34*90c8c64dSAndroid Build Coastguard Worker             Color.RED,
35*90c8c64dSAndroid Build Coastguard Worker             Color.GREEN,
36*90c8c64dSAndroid Build Coastguard Worker             Color.BLUE,
37*90c8c64dSAndroid Build Coastguard Worker             Color.CYAN,
38*90c8c64dSAndroid Build Coastguard Worker             Color.MAGENTA
39*90c8c64dSAndroid Build Coastguard Worker     };
40*90c8c64dSAndroid Build Coastguard Worker 
41*90c8c64dSAndroid Build Coastguard Worker     private int mFromColorIndex;
42*90c8c64dSAndroid Build Coastguard Worker     private int mToColorIndex;
43*90c8c64dSAndroid Build Coastguard Worker 
44*90c8c64dSAndroid Build Coastguard Worker     /**
45*90c8c64dSAndroid Build Coastguard Worker      * Value b/t 0 and 1.
46*90c8c64dSAndroid Build Coastguard Worker      */
47*90c8c64dSAndroid Build Coastguard Worker     private float mProgress;
48*90c8c64dSAndroid Build Coastguard Worker 
49*90c8c64dSAndroid Build Coastguard Worker     private ArgbEvaluator mEvaluator;
50*90c8c64dSAndroid Build Coastguard Worker 
51*90c8c64dSAndroid Build Coastguard Worker     private int mCurrentColor;
52*90c8c64dSAndroid Build Coastguard Worker 
53*90c8c64dSAndroid Build Coastguard Worker     private Handler mHandler;
54*90c8c64dSAndroid Build Coastguard Worker 
PartyLightView(Context context)55*90c8c64dSAndroid Build Coastguard Worker     public PartyLightView(Context context) {
56*90c8c64dSAndroid Build Coastguard Worker         super(context);
57*90c8c64dSAndroid Build Coastguard Worker         init();
58*90c8c64dSAndroid Build Coastguard Worker     }
59*90c8c64dSAndroid Build Coastguard Worker 
PartyLightView(Context context, AttributeSet attrs)60*90c8c64dSAndroid Build Coastguard Worker     public PartyLightView(Context context, AttributeSet attrs) {
61*90c8c64dSAndroid Build Coastguard Worker         super(context, attrs);
62*90c8c64dSAndroid Build Coastguard Worker         init();
63*90c8c64dSAndroid Build Coastguard Worker     }
64*90c8c64dSAndroid Build Coastguard Worker 
65*90c8c64dSAndroid Build Coastguard Worker     @Override
onDraw(Canvas canvas)66*90c8c64dSAndroid Build Coastguard Worker     protected void onDraw(Canvas canvas) {
67*90c8c64dSAndroid Build Coastguard Worker         canvas.drawColor(mCurrentColor);
68*90c8c64dSAndroid Build Coastguard Worker         super.onDraw(canvas);
69*90c8c64dSAndroid Build Coastguard Worker     }
70*90c8c64dSAndroid Build Coastguard Worker 
startCycling()71*90c8c64dSAndroid Build Coastguard Worker     public void startCycling() {
72*90c8c64dSAndroid Build Coastguard Worker         mHandler.sendEmptyMessage(0);
73*90c8c64dSAndroid Build Coastguard Worker     }
74*90c8c64dSAndroid Build Coastguard Worker 
stopCycling()75*90c8c64dSAndroid Build Coastguard Worker     public void stopCycling() {
76*90c8c64dSAndroid Build Coastguard Worker         mHandler.removeMessages(0);
77*90c8c64dSAndroid Build Coastguard Worker     }
78*90c8c64dSAndroid Build Coastguard Worker 
init()79*90c8c64dSAndroid Build Coastguard Worker     private void init() {
80*90c8c64dSAndroid Build Coastguard Worker         mEvaluator = new ArgbEvaluator();
81*90c8c64dSAndroid Build Coastguard Worker         mHandler = new Handler() {
82*90c8c64dSAndroid Build Coastguard Worker 
83*90c8c64dSAndroid Build Coastguard Worker             @Override
84*90c8c64dSAndroid Build Coastguard Worker             public void handleMessage(Message msg) {
85*90c8c64dSAndroid Build Coastguard Worker                 mCurrentColor = getColor(mProgress, mColors[mFromColorIndex],
86*90c8c64dSAndroid Build Coastguard Worker                         mColors[mToColorIndex]);
87*90c8c64dSAndroid Build Coastguard Worker                 postInvalidate();
88*90c8c64dSAndroid Build Coastguard Worker                 mProgress += 0.1;
89*90c8c64dSAndroid Build Coastguard Worker                 if (mProgress > 1.0) {
90*90c8c64dSAndroid Build Coastguard Worker                     mFromColorIndex = mToColorIndex;
91*90c8c64dSAndroid Build Coastguard Worker                     // Find a new color.
92*90c8c64dSAndroid Build Coastguard Worker                     mToColorIndex++;
93*90c8c64dSAndroid Build Coastguard Worker                     if (mToColorIndex >= mColors.length) {
94*90c8c64dSAndroid Build Coastguard Worker                         mToColorIndex = 0;
95*90c8c64dSAndroid Build Coastguard Worker                     }
96*90c8c64dSAndroid Build Coastguard Worker                 }
97*90c8c64dSAndroid Build Coastguard Worker                 mHandler.sendEmptyMessageDelayed(0, 100);
98*90c8c64dSAndroid Build Coastguard Worker             }
99*90c8c64dSAndroid Build Coastguard Worker         };
100*90c8c64dSAndroid Build Coastguard Worker     }
101*90c8c64dSAndroid Build Coastguard Worker 
getColor(float fraction, int colorStart, int colorEnd)102*90c8c64dSAndroid Build Coastguard Worker     private int getColor(float fraction, int colorStart, int colorEnd) {
103*90c8c64dSAndroid Build Coastguard Worker         int startInt = colorStart;
104*90c8c64dSAndroid Build Coastguard Worker         int startA = (startInt >> 24) & 0xff;
105*90c8c64dSAndroid Build Coastguard Worker         int startR = (startInt >> 16) & 0xff;
106*90c8c64dSAndroid Build Coastguard Worker         int startG = (startInt >> 8) & 0xff;
107*90c8c64dSAndroid Build Coastguard Worker         int startB = startInt & 0xff;
108*90c8c64dSAndroid Build Coastguard Worker 
109*90c8c64dSAndroid Build Coastguard Worker         int endInt = colorEnd;
110*90c8c64dSAndroid Build Coastguard Worker         int endA = (endInt >> 24) & 0xff;
111*90c8c64dSAndroid Build Coastguard Worker         int endR = (endInt >> 16) & 0xff;
112*90c8c64dSAndroid Build Coastguard Worker         int endG = (endInt >> 8) & 0xff;
113*90c8c64dSAndroid Build Coastguard Worker         int endB = endInt & 0xff;
114*90c8c64dSAndroid Build Coastguard Worker 
115*90c8c64dSAndroid Build Coastguard Worker         return (startA + (int)(fraction * (endA - startA))) << 24 |
116*90c8c64dSAndroid Build Coastguard Worker                 (startR + (int)(fraction * (endR - startR))) << 16 |
117*90c8c64dSAndroid Build Coastguard Worker                 (startG + (int)(fraction * (endG - startG))) << 8 |
118*90c8c64dSAndroid Build Coastguard Worker                 ((startB + (int)(fraction * (endB - startB))));
119*90c8c64dSAndroid Build Coastguard Worker     }
120*90c8c64dSAndroid Build Coastguard Worker }
121