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