13a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood/*
23a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Copyright (C) 2008 The Android Open Source Project
33a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood *
43a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
53a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * you may not use this file except in compliance with the License.
63a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * You may obtain a copy of the License at
73a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood *
83a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
93a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood *
103a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Unless required by applicable law or agreed to in writing, software
113a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
123a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * See the License for the specific language governing permissions and
143a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * limitations under the License.
153a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood */
163a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
17182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipackage com.android.server.lights;
18182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
19182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport com.android.server.SystemService;
203a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
213a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.content.Context;
223a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.os.Handler;
233a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.os.Message;
243edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brownimport android.os.Trace;
258a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
263a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
27182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipublic class LightsService extends SystemService {
28182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    static final String TAG = "LightsService";
29182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    static final boolean DEBUG = false;
303a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
31182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT];
323a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
33182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private final class LightImpl extends Light {
343a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
35182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        private LightImpl(int id) {
363cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            mId = id;
373cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
383a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
39182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
403cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void setBrightness(int brightness) {
413cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            setBrightness(brightness, BRIGHTNESS_MODE_USER);
423cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
433a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
44182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
453cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void setBrightness(int brightness, int brightnessMode) {
463cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
473cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                int color = brightness & 0x000000ff;
483cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                color = 0xff000000 | (color << 16) | (color << 8) | color;
493cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
503cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            }
513cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
523a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
53182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
543cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void setColor(int color) {
553cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
563cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, 0);
573cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            }
583cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
593a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
60182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
613cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void setFlashing(int color, int mode, int onMS, int offMS) {
623cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
633cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                setLightLocked(color, mode, onMS, offMS, BRIGHTNESS_MODE_USER);
643cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            }
653cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
663a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
67182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
683cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void pulse() {
69670f93283b5e2445c58998153de9c476acddc37bMike Lockwood            pulse(0x00ffffff, 7);
70670f93283b5e2445c58998153de9c476acddc37bMike Lockwood        }
71670f93283b5e2445c58998153de9c476acddc37bMike Lockwood
72182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
73670f93283b5e2445c58998153de9c476acddc37bMike Lockwood        public void pulse(int color, int onMS) {
743cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
753cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                if (mColor == 0 && !mFlashing) {
76670f93283b5e2445c58998153de9c476acddc37bMike Lockwood                    setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, BRIGHTNESS_MODE_USER);
77e8467194dc8d56b5cf418b025b041737754b98b3Oskar Andero                    mColor = 0;
78670f93283b5e2445c58998153de9c476acddc37bMike Lockwood                    mH.sendMessageDelayed(Message.obtain(mH, 1, this), onMS);
793cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                }
803cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            }
813cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
823a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
83182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
843cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        public void turnOff() {
853cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
863cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, 0);
873cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            }
883a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        }
893a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
903cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private void stopFlashing() {
913cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            synchronized (this) {
923cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                setLightLocked(mColor, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_USER);
933a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood            }
943cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
953cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood
963cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) {
973cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            if (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS) {
98ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
99ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn                        + Integer.toHexString(color));
1003cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                mColor = color;
1013cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                mMode = mode;
1023cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                mOnMS = onMS;
1033cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood                mOffMS = offMS;
104faec22c8e19d123bdbcfe5ba2c1ec7fe21516faaJeff Brown                Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x"
105faec22c8e19d123bdbcfe5ba2c1ec7fe21516faaJeff Brown                        + Integer.toHexString(color) + ")");
1063edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown                try {
1073edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown                    setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode);
1083edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown                } finally {
1093edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown                    Trace.traceEnd(Trace.TRACE_TAG_POWER);
1103edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown                }
1113a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood            }
1123a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        }
1133cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood
1143cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private int mId;
1153cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private int mColor;
1163cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private int mMode;
1173cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private int mOnMS;
1183cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private int mOffMS;
1193cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        private boolean mFlashing;
1203cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood    }
1213cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood
122b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown    public LightsService(Context context) {
123b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown        super(context);
124b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown
1253cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        mNativePointer = init_native();
126eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood
127182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) {
128182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            mLights[i] = new LightImpl(i);
1293cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        }
1303cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood    }
1313cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood
132182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    @Override
133182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    public void onStart() {
134182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        publishLocalService(LightsManager.class, mService);
135182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    }
136182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
137182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    private final LightsManager mService = new LightsManager() {
138182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        @Override
1395d6443bf7c087167e47ea39b13e6af09cb43ad97Jeff Brown        public Light getLight(int id) {
140182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            if (id < LIGHT_ID_COUNT) {
141182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski                return mLights[id];
142182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            } else {
143182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski                return null;
144182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            }
145182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski        }
146182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski    };
147182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski
148b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown    @Override
1493cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood    protected void finalize() throws Throwable {
1503cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        finalize_native(mNativePointer);
1513cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood        super.finalize();
1523cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood    }
1533cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood
1543a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood    private Handler mH = new Handler() {
1553a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        @Override
1563a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        public void handleMessage(Message msg) {
157182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski            LightImpl light = (LightImpl)msg.obj;
1583cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood            light.stopFlashing();
1593a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        }
1603a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood    };
1613a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
1627e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat    private static native long init_native();
1637e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat    private static native void finalize_native(long ptr);
1643a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
1653f7b8d0c6c2b1b6a8d183769621f5fd9c36cfc85Narayan Kamath    static native void setLight_native(long ptr, int light, int color, int mode,
1663a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood            int onMS, int offMS, int brightnessMode);
1673a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood
1687e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat    private long mNativePointer;
1693a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood}
170