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