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; 20c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunkimport com.android.server.vr.VrManagerService; 213a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 2249506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunkimport android.app.ActivityManager; 233a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.content.Context; 243a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.os.Handler; 253a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodimport android.os.Message; 26c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunkimport android.os.RemoteException; 273edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brownimport android.os.Trace; 2849506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunkimport android.os.UserHandle; 2949506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunkimport android.provider.Settings; 30c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunkimport android.service.vr.IVrManager; 31c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunkimport android.service.vr.IVrStateCallbacks; 328a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 333a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 34182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipublic class LightsService extends SystemService { 35182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski static final String TAG = "LightsService"; 36182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski static final boolean DEBUG = false; 373a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 38182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT]; 3949506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk private boolean mVrModeEnabled; 403a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 41182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final class LightImpl extends Light { 423a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 43182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private LightImpl(int id) { 443cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mId = id; 453cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 463a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 47182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 483cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void setBrightness(int brightness) { 493cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setBrightness(brightness, BRIGHTNESS_MODE_USER); 503cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 513a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 52182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 533cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void setBrightness(int brightness, int brightnessMode) { 543cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 553cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood int color = brightness & 0x000000ff; 563cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood color = 0xff000000 | (color << 16) | (color << 8) | color; 573cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode); 583cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 593cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 603a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 61182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 623cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void setColor(int color) { 633cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 643cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, 0); 653cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 663cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 673a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 68182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 693cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void setFlashing(int color, int mode, int onMS, int offMS) { 703cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 713cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setLightLocked(color, mode, onMS, offMS, BRIGHTNESS_MODE_USER); 723cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 733cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 743a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 75182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 763cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void pulse() { 77670f93283b5e2445c58998153de9c476acddc37bMike Lockwood pulse(0x00ffffff, 7); 78670f93283b5e2445c58998153de9c476acddc37bMike Lockwood } 79670f93283b5e2445c58998153de9c476acddc37bMike Lockwood 80182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 81670f93283b5e2445c58998153de9c476acddc37bMike Lockwood public void pulse(int color, int onMS) { 823cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 838ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk if (mBrightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) { 848ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk return; 858ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 863cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood if (mColor == 0 && !mFlashing) { 87670f93283b5e2445c58998153de9c476acddc37bMike Lockwood setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, BRIGHTNESS_MODE_USER); 88e8467194dc8d56b5cf418b025b041737754b98b3Oskar Andero mColor = 0; 89670f93283b5e2445c58998153de9c476acddc37bMike Lockwood mH.sendMessageDelayed(Message.obtain(mH, 1, this), onMS); 903cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 913cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 923cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 933a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 94182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 953cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood public void turnOff() { 963cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 973cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, 0); 983cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 993a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood } 1003a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 1018ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk void enableLowPersistence() { 1028ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk synchronized(this) { 1038ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_LOW_PERSISTENCE); 1048ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mLocked = true; 1058ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1068ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1078ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk 1088ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk void disableLowPersistence() { 1098ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk synchronized(this) { 1108ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mLocked = false; 1118ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk setLightLocked(mLastColor, LIGHT_FLASH_NONE, 0, 0, mLastBrightnessMode); 1128ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1138ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1148ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk 1153cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private void stopFlashing() { 1163cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood synchronized (this) { 1173cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood setLightLocked(mColor, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_USER); 1183a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood } 1193cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 1203cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 1213cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) { 1228ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk if (!mLocked && (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS || 1238ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mBrightnessMode != brightnessMode)) { 124ff801ec71399f7e8aa95bcbb9937c53144fe17c5Dianne Hackborn if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#" 1258ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode); 1268ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mLastColor = mColor; 1273cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mColor = color; 1283cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mMode = mode; 1293cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mOnMS = onMS; 1303cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mOffMS = offMS; 1318ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mLastBrightnessMode = mBrightnessMode; 1328ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk mBrightnessMode = brightnessMode; 133faec22c8e19d123bdbcfe5ba2c1ec7fe21516faaJeff Brown Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x" 134faec22c8e19d123bdbcfe5ba2c1ec7fe21516faaJeff Brown + Integer.toHexString(color) + ")"); 1353edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown try { 1363edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown setLight_native(mNativePointer, mId, color, mode, onMS, offMS, brightnessMode); 1373edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown } finally { 1383edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown Trace.traceEnd(Trace.TRACE_TAG_POWER); 1393edf5272fb2185403dfe64b9722b9fc9b9de80f8Jeff Brown } 1403a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood } 1413a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood } 1423cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 1433cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private int mId; 1443cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private int mColor; 1453cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private int mMode; 1463cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private int mOnMS; 1473cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private int mOffMS; 1483cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood private boolean mFlashing; 1498ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk private int mBrightnessMode; 1508ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk private int mLastBrightnessMode; 1518ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk private int mLastColor; 1528ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk private boolean mLocked; 1533cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 1543cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 155b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown public LightsService(Context context) { 156b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown super(context); 157b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown 1583cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood mNativePointer = init_native(); 159eb9cbb8fdddf4c887004b20b504083035d57a15fMike Lockwood 160182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski for (int i = 0; i < LightsManager.LIGHT_ID_COUNT; i++) { 161182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski mLights[i] = new LightImpl(i); 1623cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 1633cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 1643cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 165182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 166182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski public void onStart() { 167182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski publishLocalService(LightsManager.class, mService); 168182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 169182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski 1708ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk @Override 1718ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk public void onBootPhase(int phase) { 1728ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk if (phase == PHASE_SYSTEM_SERVICES_READY) { 173c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk IVrManager vrManager = 174c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk (IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE); 175c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk try { 176c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk vrManager.registerListener(mVrStateCallbacks); 177c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk } catch (RemoteException e) { 178c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk Slog.e(TAG, "Failed to register VR mode state listener: " + e); 179c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk } 1808ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1818ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 1828ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk 18349506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk private int getVrDisplayMode() { 18449506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk int currentUser = ActivityManager.getCurrentUser(); 18549506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk return Settings.Secure.getIntForUser(getContext().getContentResolver(), 18649506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk Settings.Secure.VR_DISPLAY_MODE, 18749506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk /*default*/Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE, 18849506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk currentUser); 18949506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk } 19049506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk 191c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { 1928ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk @Override 193c7be3beced4ade05466a4a77c003ea81c2429f74Ruben Brunk public void onVrStateChanged(boolean enabled) throws RemoteException { 1948ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk LightImpl l = mLights[LightsManager.LIGHT_ID_BACKLIGHT]; 19549506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk int vrDisplayMode = getVrDisplayMode(); 19649506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk 19749506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk // User leaves VR mode before altering display settings. 19849506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk if (enabled && vrDisplayMode == Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE) { 19949506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk if (!mVrModeEnabled) { 20049506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk if (DEBUG) 20149506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk Slog.v(TAG, "VR mode enabled, setting brightness to low persistence"); 20249506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk l.enableLowPersistence(); 20349506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk mVrModeEnabled = true; 20449506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk } 2058ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } else { 20649506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk if (mVrModeEnabled) { 20749506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk if (DEBUG) Slog.v(TAG, "VR mode disabled, resetting brightnes"); 20849506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk l.disableLowPersistence(); 20949506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk mVrModeEnabled = false; 21049506e089103e8fe38d10e0589688e51cceacaf2Ruben Brunk } 2118ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 2128ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk } 2138ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk }; 2148ad3f208a93b2a842f20d5c78b2c010ae7583e86Ruben Brunk 215182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final LightsManager mService = new LightsManager() { 216182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 2175d6443bf7c087167e47ea39b13e6af09cb43ad97Jeff Brown public Light getLight(int id) { 218182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski if (id < LIGHT_ID_COUNT) { 219182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski return mLights[id]; 220182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } else { 221182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski return null; 222182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 223182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 224182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski }; 225182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski 226b880d880c6cd989eacc28c365fc9a41d31900da1Jeff Brown @Override 2273cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood protected void finalize() throws Throwable { 2283cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood finalize_native(mNativePointer); 2293cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood super.finalize(); 2303cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood } 2313cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood 2323a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood private Handler mH = new Handler() { 2333a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood @Override 2343a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood public void handleMessage(Message msg) { 235182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski LightImpl light = (LightImpl)msg.obj; 2363cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood light.stopFlashing(); 2373a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood } 2383a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood }; 2393a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 2407e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat private static native long init_native(); 2417e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat private static native void finalize_native(long ptr); 2423a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 2433f7b8d0c6c2b1b6a8d183769621f5fd9c36cfc85Narayan Kamath static native void setLight_native(long ptr, int light, int color, int mode, 2443a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood int onMS, int offMS, int brightnessMode); 2453a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 2467e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat private long mNativePointer; 2473a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood} 248